0

我正在尝试等待 .NET 4 中的任务结果,就像您可以使用 .NET 4.5 中的 await 关键字一样。我只是不知道该怎么做......

我的代码(证明我至少在尝试):

    Private Function GetXDocumentFromWebLocationAsync(ByVal request As WebRequest) As XDocument
        Dim queryTask As Task(Of WebResponse)
        queryTask = task(Of WebResponse).Factory.FromAsync(AddressOf request.BeginGetResponse, AddressOf request.EndGetResponse, Nothing, Nothing)
        Return XDocument.Load(queryTask.Result.GetResponseStream)
    End Function

如您所料,GetResponse 调用在不同的线程上执行,但函数必须等待结果才能返回。不幸的是,这会阻塞我的主线程,直到任务完成,我对如何让它等待而不阻塞毫无头绪。我也不想使用异步 CTP,因为那只是逃避问题。

秘方是什么?

4

1 回答 1

3

没有秘方。如果你想创建一个返回某个异步操作结果的方法,你只需要阻塞线程直到操作完成。

但是还有其他方法可以实现相同的目标。在 .Net 中执行此操作的“旧”方式是相同的WebRequest用途:有两种方法BeginGetXDocumentEndGetXDocument. 然后,您可以将委托传递给Begin将在操作完成时执行的方法。

Task另一种方法是从您的方法中返回 a 。为此,您可以使用ContinueWith()

Private Function GetXDocumentFromWebLocationAsync(ByVal request As WebRequest) As Task(Of XDocument)
    Dim queryTask As Task(Of WebResponse)
    queryTask = Task(Of WebResponse).Factory.FromAsync(
        AddressOf request.BeginGetResponse, AddressOf request.EndGetResponse, Nothing, Nothing)
    Return queryTask.ContinueWith(
        Function(antecendent) XDocument.Load(antecendent.Result.GetResponseStream))
End Function

这样,方法的使用者可以选择同步等待结果(使用Wait()or Result),也可以ContinueWith()再次使用。

在 GUI 应用程序中使用ContinueWith()时,您必须小心:默认情况下,延续在 ThreadPool 线程上运行。要在 GUI 线程上运行延续,您可以使用TaskScheduler.FromCurrentSynchronizationContext(). 或特定于您的 GUI 库的方法(Dispatcher.Invoke()在 WPF 中,Control.Invoke()在 Winforms 中)。

于 2012-04-30T12:31:15.293 回答