0

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

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

有什么想法吗?

4

1 回答 1

2

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

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))

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

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

于 2019-04-05T18:52:33.100 回答