Vb.net Net异步-检查大型字符串列表以查找匹配项

Vb.net Net异步-检查大型字符串列表以查找匹配项,vb.net,asynchronous,async-await,Vb.net,Asynchronous,Async Await,我需要这个函数来运行异步,但似乎找不到一个方法来实现它 LIST1是公共的,包含一个包含几百个条目的列表(字符串)。名单声明: Public LIST1 As New List(Of String) 通常,我会运行以下代码来检索列表是否包含条目的布尔值: Dim result = LIST1.Any(Function(s) value.ToLower.Contains(s)) 完整的非异步功能: Function CheckValue(byval value As String) As Bo

我需要这个函数来运行异步,但似乎找不到一个方法来实现它

LIST1是公共的,包含一个包含几百个条目的列表(字符串)。名单声明:

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方法


有什么想法吗?

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

Dim result As Boolean = Await Task.Run(Function() LIST1.Any(Function(s) value.ToLower.Contains(s)))
或者,正如GSerg所提到的,尽管从技术上讲,这并不意味着可以等待,但您可以使用
aspallel。Any

Dim result As Boolean = LIST1.AsParallel.Any(Function(s) value.ToLower.Contains(s))
但是,请注意,启动新线程有相当大的开销,因此启动一个新线程,只需做少量的工作,可能会使它实际上运行得更慢


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

Any()
不是异步的。您不能将其设置为异步。为它创建一个异步包装器是没有意义的,因为它不是IO-WORD。您想要或考虑消除多余的字符串分配。不要使用
value.ToLower.Contains
ToLower
创建一个新字符串),而是使用
value.IndexOf(s,StringComparison.CurrentCultureIgnoreCase)>0
。谢谢@Steven Doggart,这个解释很有帮助。我很感激。