我需要此函数来运行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方法。
有什么想法吗?
答案 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库,我不会感到惊讶。