【问题标题】:VB.Net Async - Check large list of string for a matchVB.Net Async - 检查大型字符串列表是否匹配
【发布时间】:2019-04-06 02:52:33
【问题描述】:

我需要这个函数来运行异步,但似乎无法找到方法。

LIST1 是公共的,包含一个包含数百个条目的 List(of String)。清单声明:

Public LIST1 As New List(Of String)

通常,我会运行以下代码来检索他的列表是否包含条目的布尔值:

Dim result = LIST1.Any(Function(s) value.ToLower.Contains(s))

完整的非异步功能:

Function CheckValue(byval value As String) As Boolean
    Dim result As Boolean = LIST1.Any(Function(s) value.ToLower.Contains(s))
    Return result
End Function

效果符合预期。

如何实现与异步函数相同的功能?我试过了:

Async Function CheckValue(byval value as String) As Task(Of Boolean)
    Dim result as Task(Of Boolean) = Await LIST1.Any(Function(s) value.ToLower.Contains(s))
    Return result
End Function

我收到以下错误:“等待”要求“布尔”类型具有合适的 GetAwaiter 方法。

有什么想法吗?

【问题讨论】:

  • Any() 不是异步的。你不能让它异步。为它创建一个异步包装器也没有意义,因为它不是 IO 绑定的。
  • 考虑消除多余的字符串分配。而不是value.ToLower.Contains(s)ToLower 创建一个新字符串),使用value.IndexOf(s, StringComparison.CurrentCultureIgnoreCase) > 0

标签: vb.net asynchronous async-await


【解决方案1】:

它不返回任务,因此没有理由等待它。如果您担心它太慢,您可以在新线程中运行任何同步代码,然后等待该线程完成,如下所示:

Dim result As Boolean = Await Task.Run(Function() LIST1.Any(Function(s) value.ToLower.Contains(s)))

或者,正如 GSerg 所提到的,虽然从技术上讲它不能等待,但您可以使用 AsParallel.Any

Dim result As Boolean = LIST1.AsParallel.Any(Function(s) value.ToLower.Contains(s))

但是,请注意,启动新线程会产生相当大的开销,因此启动新线程只是为了完成少量工作,实际上可能会使其运行速度变慢。

在这种特殊情况下,如果性能是关键,我建议研究各种搜索/索引算法。例如,看看提到的一些here。如果有用于这些算法的开源 .NET 库,我不会感到惊讶。

【讨论】:

  • 谢谢@Steven Doggart,这个解释很有帮助。我很感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 2015-07-27
  • 2016-01-12
  • 2010-12-19
  • 1970-01-01
相关资源
最近更新 更多