試圖理解爲什麼.NET實現他們的方式async-await。極簡主義實現異步等待
當改變的代碼使用異步等待下一個簡單的部分,好像是最需要的努力是爲紀念這兩個調用,並異步等待指令調用的方法:
private async void OnGuiClick(object sender, EventArgs args)
{
textBox1.Text = await Work();
}
private async Task<string> Work()
{
await Task.Delay(2000);
return "Result";
}
爲什麼。 NET堅持兩者? ie用一個關鍵字指定一個表達式時,必須立即在一個工作線程上異步評估一個表達式 - 當調用GUI線程被釋放以執行其他任務時,將被重新連接以執行剩餘的代碼一旦工作者線程完成。
是否有更簡單或更好的方式分配工作線程來處理Work方法,然後自動(無需訴諸Invoke(...))確保相同的調用GUI線程處理結果? 爲什麼不能是這樣的:?
private void OnGuiClick(object sender, EventArgs args)
{
textBox1.Text = <'some async directive'> Work();
}
private string Work()
{
Thread.Sleep(2000);
return "Result";
}
(該MSDN documentation指出,編譯器將執行代碼同步,如果目標不包含的await語句 - 但隨後又有什麼意義 - 當然了的await異步關鍵字僅用於爲什麼使它變得如此複雜,而不是使用單個指令?)
Eric Lippert發佈了一個體面的[博客文章](http://blogs.msdn.com/b/ericlippert/archive/2010/10/29/asynchronous-programming-in-c-5-0-part-two -whence-await.aspx)有些時間可能值得閱讀,例如:「該方法的」異步「修飾符並不意味着」此方法自動調度爲異步運行在工作線程上「」和「整個儘可能多地保留在當前線程上的異步方法。「 –
謝謝 - 這篇文章確實有所幫助:await不會創建工作線程,它會使用當前線程。異步不保證異步實現(即使編譯器會發出警告),開發人員需要確保異步方法正確異步。 – Fortmann
可能的重複[爲什麼async關鍵字存在](http://stackoverflow.com/questions/9225748/why-does-the-async-keyword-exist) –