10

What would be the best alternative for the await keyword in .NET 4.0 ? I have a method which needs to return a value after an asynchronous operation. I noticed the wait() method blocks the thread completely thus rendering the asynchronous operation useless. What are my options to run the async operation while still freeing the UI thread ?

4

2 回答 2

4

我认为你的基本选择是

最简单的方法可能是安装 Async CTP。据我所知,许可证允许商业用途。它修补编译器并附带一个 150kb 的 dll,您可以将其包含到您的项目中。

您可以使用Task.ContinueWith()。但这意味着,您必须在异常处理和流量控制方面付出一些努力。

任务是一种功能结构。这就是为什么ContinueWith()不能很好地与for循环或try-catch块等命令式结构混合使用。因此async,并await得到了介绍,以便编译器可以帮助我们。

如果你不能得到编译器的支持(即你使用.Net 4.0),你最好的办法是使用TAP和一个功能框架。Reactive Extensions是一个很好的处理异步方法的框架。

只需谷歌搜索“反应式扩展任务”即可开始。

于 2012-11-19T19:58:10.727 回答
2

您可以实现awaityield协程类似的行为,我在非 4.5 代码中使用它。您需要一个YieldInstruction从应该异步运行的方法中检索的类:

public abstract class YieldInstruction
{
    public abstract Boolean IsFinished();
}

然后你需要一些YieldInstruction(处理任务的ae TaskCoroutine)的实现并以这种方式使用它(伪代码):

public IEnumerator<YieldInstruction> DoAsync()
{
    HttpClient client = ....;
    String result;
    yield return new TaskCoroutine(() => { result = client.DownloadAsync(); });
    // Process result here
}

现在您需要一个调度程序来处理指令的执行。

for (Coroutine item in coroutines)  
{  
    if (item.CurrentInstruction.IsFinished())  
    {
         // Move to the next instruction and check if coroutine has been finished 
         if (item.MoveNext()) Remove(item);
    }
}

Invoke在开发 WPF 或 WinForms 应用程序时,如果您在正确的时间更新协程,您也可以避免任何调用。你也可以扩展这个想法,让你的生活更轻松。样本:

public IEnumerator<YieldInstruction> DoAsync()
{
    HttpClient client = ....;
    client.DownloadAsync(..);

    String result;
    while (client.IsDownloading)
    {
        // Update the progress bar
        progressBar.Value = client.Progress;
        // Wait one update
        yield return YieldInstruction.WaitOneUpdate;
    }
    // Process result here
}
于 2012-11-20T09:49:45.137 回答