2012-09-22 58 views
-1

最近我嘗試瞭解異步編程的新C#功能,async/await關鍵字。當我在網上搜索時,我遇到過這樣的例子:C#中的異步編程#

static void Main(string[] args) 
    { 
     Console.WriteLine("Task based APM demo"); 

     // Call Exponnent() asynchronously. 
     // And immediately return the control flow. 
     // If I don't put a Task here, the program will sometimes 
     // terminate immediately. 
     Task t = new Task(async() => 
     { 
      int result = await Program.Exponent(10); 

      // After the operation is completed, the control flow will go here. 
      Console.WriteLine(result); 
     }); 

     t.Start(); 
     Console.ReadKey(); 
    } 

    static async Task<int> Exponent(int n) 
    { 
     Console.WriteLine("Task started"); 
     return await TaskEx.Run<int>(() => 2 << (n - 1)); 
    } 
} 

我對此有疑問,以及這種說法的行爲方式。 首先,當我理解當我們想要釋放該過程並返回到調用者上下文時使用的await表達式。但爲什麼這個表達式在Exponent方法調用它的那條線上使用了這個表達式?事實上,當編譯器面對這一行程序時會發生什麼? 而字母問題是,爲什麼程序使用「TaskEx.Run」來返回Exponent方法體中的結果?是否有可能使用「return await(()=> 2 < <(n-1));」只要?編譯器如何處理這一行?

在此先感謝

+0

我認爲這個問題應該有一個更具體的標題,但我不知道它應該是什麼。任何人有想法? – svick

+0

@Azad:我建議你先介紹一下'async'(比如[我博客上的](http://nitoprograms.blogspot.com/2012/02/async-and-await.html))和然後使用[async/await FAQ](http://blogs.msdn.com/b/pfxteam/archive/2012/04/12/10293335.aspx)進行跟蹤。 –

回答

1

但是,爲什麼這種表達在其指數稱爲它自己的行用這個?

我不確定這個問題是什麼意思。 await Task.Run<int>(() => 2 << (n - 1));通知編譯器暫停執行當前方法,直到任務完成。在任務而言,這是類似於:

Task.Run<int>(() => 2 << (n - 1)).ContinueWith(t=>return t.Result); 

但是,當然,你不能從return的延續。關鍵字async不僅告訴編譯器,方法中可能有一個或多個await運算符,但設置狀態機來管理從異步操作開始和返回的不同狀態轉換。同樣,這可能會影響該方法在與調用方異步的關係中的執行方式。

至於在Main使用的Task:你不能在await一個Main方法調用,所以,我假設Task用於仍然使用await操作。但是,它似乎是多餘的。我可能只需要使用await另一種方法:

static async void Method() 
    { 
     Console.WriteLine(await Exponent(10)); 
    } 

然後重新寫Main

static void Main(string[] args) 
    { 
     Method(); 
     Console.ReadLine(); 
    } 

但是,我不知道爲什麼代碼最初寫了這樣或那樣的背後原因即使有真正的目的。

是否可以使用「return await(()=> 2 < <(n-1));」

這是不可能寫這行代碼,因爲沒有任何異步正在執行。 () => 2 << (n - 1)既不返回一個Task對象,也不具有與其關聯的GetAwaiter方法;所以它可以異步執行。因此,它不能被「等待」。

+0

第一個問題涉及以下行:Task t = new Task(async()=> {int result = await Program.Exponent(10);});爲什麼我們應該使用await表達式來調用Exponent方法,如果它在方法體中使用的話? – Azad

+0

@Azad我看到了,我已經更新了我的答案。 –