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 ?
2 回答
我认为你的基本选择是
最简单的方法可能是安装 Async CTP。据我所知,许可证允许商业用途。它修补编译器并附带一个 150kb 的 dll,您可以将其包含到您的项目中。
您可以使用Task
和.ContinueWith()
。但这意味着,您必须在异常处理和流量控制方面付出一些努力。
任务是一种功能结构。这就是为什么ContinueWith()
不能很好地与for
循环或try-catch
块等命令式结构混合使用。因此async
,并await
得到了介绍,以便编译器可以帮助我们。
如果你不能得到编译器的支持(即你使用.Net 4.0),你最好的办法是使用TAP和一个功能框架。Reactive Extensions是一个很好的处理异步方法的框架。
只需谷歌搜索“反应式扩展任务”即可开始。
您可以实现await
与yield
协程类似的行为,我在非 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
}