VB.Net异步-检查匹配的大型字符串列表

时间:2019-04-05 18:24:07

标签: vb.net asynchronous async-await

我需要此函数来运行Async,但似乎找不到解决方法。

LIST1是Public,并且包含具有数百个条目的List(字符串)。列表声明:

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

我收到以下错误:'Await'要求'Boolean'类型具有合适的GetAwaiter方法。

有什么想法吗?

1 个答案:

答案 0 :(得分: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库,我不会感到惊讶。