什么是.NET 4.0中await关键字的最佳选择?我有一个方法需要在异步操作后返回一个值。我注意到wait()方法完全阻塞了线程,从而导致异步操作无用。在仍然释放UI线程的同时运行异步操作的选项有哪些?在.NET 4.0中等待替代?
10
A
回答
4
我觉得你的基本选项
- 使用
Task
和.ContinueWith()
- 使用异步CTP和
async
/await
- 使用Reactive Extensions
最简单的方法可能是安装异步CTP。据我所知,许可证允许商业用途。它修补了编译器,并带有一个150KB的dll,你可以将它包含到你的项目中。可以使用Task
和.ContinueWith()
。但这意味着,你必须采取一些措施来处理和控制流量。
任务是一个功能结构。这就是为什么ContinueWith()
不能与命令性结构如for
环或try-catch
块混合良好。因此async
和await
得到了介绍,以便编译器可以帮助我们。
如果你不能得到编译器的支持(即使用.Net 4.0),最好的方法是将TAP与功能框架一起使用。 Reactive Extensions是一个处理异步方法的非常好的框架。
刚刚谷歌的“反应扩展任务”开始。
1
你可以用yield
协程来实现类似await
的行为,我在非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
}
相关问题
- 1. 异步/等待在.NET 4.0中
- 2. 在Net 4.0中使用Microsoft.Bcl.Async等待Observable
- 3. 替代等待,并在java中通知
- 4. .NET 4.0替代.NET 4.5命名空间
- 5. 异步/等待task.run与task.run并在.NET 4.0中继续
- 6. 替代活动中的等待转换
- 7. .NET Charting 4.0 - 使线条代替酒吧
- 8. .NET 4.0中.NET 4.5的Task.FromResult()的等效
- 9. .Net 4.5等待中断点
- 10. 替代TimerTask,它支持等待完成?
- 11. 替代Microsoft.Jet.OLEDB.4.0
- 12. 等待与.NET 4.0:有意义的堆栈跟踪
- 13. 使用异步芒差实现异步超时/等待构建在.NET 4.0中
- 14. 替代在.NET
- 15. 安装.NET 4.5是否真的替代.NET 4.0程序集?
- 16. 替换.NET 4.0中的XopDocument类
- 17. Firebug Net等待时间
- 18. MongoDB的.NET异步等待
- 19. 用NetworkStream.ReadAsync替换Socket.ReceiveAsync(等待)
- 20. 等待所有任务完成使用.NET 4.0中的任务并行库
- 21. 如何在数组迭代中等待?
- 22. Rails Observer替代品4.0
- 23. C#.NET 4.5的代码到.NET 4.0
- 24. 替代Microsoft Sync Framework 4.0
- 25. .NET/WPF替代
- 26. .NET替代
- 27. ZooKeeper替代.net
- 28. 异步等待目标4.0部署要求
- 29. 在Java中等待
- 30. 在android中等待
使用await,但以正确的方式,我猜。你有一些代码? – lboshuizen
将VS2012与C#5.0一起使用,而将.NET 4.0作为目标是否可以接受?请参阅[在.net 4上使用async-await](http://stackoverflow.com/questions/9110472/using-async-await-on-net-4) – CodesInChaos
@CodesInChaos对于同事,不:)。 – Dante