什么是在.NET 4.0中的await关键字的最佳替代品? 我有需要异步操作后返回一个值的方法。 我注意到wait()方法块中的线程完全因而使异步操作无用。 我有哪些选择运行异步操作,同时还释放UI线程?
Answer 1:
我觉得你的基本选项
- 使用
Task
和.ContinueWith()
- 使用异步CTP和
async
/await
- 使用无扩展
最简单的方法可能是安装异步CTP。 据我所知道的许可证允许使用罗科梅。 它修补编译器,并配有150KB的DLL,您可以包括到您的项目。
您可以使用Task
和.ContinueWith()
但是,这意味着,你必须付出一些努力与exeption处理和流量控制。
任务的功能结构。 这就是为什么ContinueWith()
不符合必要的结构,如拌匀for
循环或try-catch
块。 因此, async
和await
得到了介绍,使编译器可以帮助我们。
如果你不能有一个支持的编译器(即您使用.NET 4.0),最好的办法是使用TAP与功能框架在一起。 无扩展是治疗异步方法一个非常好的框架。
只是谷歌用于“无扩展任务”即可开始。
Answer 2:
就像你可以实现一个行为, 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);
}
}
当开发WPF或WinForms的应用程序,你也能避免任何Invoke
呼叫如果您在合适的时间更新协程。 您可能还能够延长的想法,使您的生活更轻松。 样品:
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
}
文章来源: Await alternative in .NET 4.0?