什麼是.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