在.NET 4.0中等待替代?
什么是.NET 4.0中await关键字的最佳替代方案? 我有一个方法,需要在异步操作后返回一个值。 我注意到wait()方法完全阻塞了线程,从而使异步操作无效。 在释放UI线程的同时运行异步操作有哪些选择?
我认为你的基本选择是
最简单的方法可能是安装Async CTP。 据我所知,许可证允许商业用途。 它会对编译器进行修补,并附带一个150kb的dll,您可以将其包含在项目中。
您可以使用Task
和.ContinueWith()
。 但这意味着,您必须在exeption处理和流量控制方面付出一些努力。
任务是一个function构造。 这就是为什么ContinueWith()
与for
循环或try-catch
块等命令式结构不能很好地混合的原因。 因此async
和await
被引入,以便编译器可以帮助我们。
如果您不能获得编译器的支持(即使用.Net 4.0),最好的办法是将TAP与function框架一起使用。 Reactive Extensions是一个非常好的框架来处理异步方法。
只需谷歌“react native扩展任务”即可开始使用。
您可以使用yield
协程实现类似await
的行为,我在非4.5代码中使用它。 您需要一个YieldInstruction
类,该类从应该运行异步的方法中检索:
public abstract class YieldInstruction { public abstract Boolean IsFinished(); }
然后你需要一些YieldInstruction
实现(ae TaskCoroutine
来处理一个任务)并以这种方式使用它(伪代码):
public IEnumerator 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
调用。 您也可以扩展这个想法,让您的生活更轻松。 样品:
上述就是C#学习教程:在.NET 4.0中等待替代?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
public IEnumerator 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 }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1031617.html