2011-02-27 69 views
3

我正試圖討論C#5的新異步功能是如何工作的。假設我想開發一個原子增量函數來增加一個虛構的IntStore中的整數。僅在一個線程中對此函數進行多次調用。C#5.0異步如何工作?

async void IncrementKey(string key) { 
    int i = await IntStore.Get(key); 
    IntStore.Set(key, i+1); 
} 

在我看來,這個功能是有缺陷的。兩次調用IncrementKey可能會從IntStore返回相同的數字(如5),然後將其設置爲6,從而失去其中一個增量?

如果IntStore.Get是異步的(返回任務)以便正確工作,如何重寫?

性能至關重要,是否有避免鎖定的解決方案?

回答

4

如果您確定只從一個線程調用您的函數,那麼應該沒有任何問題,因爲只有一個調用IntStore.Get可能在等待。這是因爲:

await IncrementKey("AAA"); 
await IncrementKey("BBB"); 

第二個IncrementKey將不會執行,直到第一個IncrementKey完成。該代碼將被轉換爲狀態機。如果你不相信它,改變IntStore.Get(鍵):

async Task<int> IntStore(string str) { 
    Console.WriteLine("Starting IntStore"); 
    await TaskEx.Delay(10000); 
    return 0; 
} 

你會看到第二個Starting IntStore將第一後寫10秒。

從這裏http://blogs.msdn.com/b/ericlippert/archive/2010/10/29/asynchronous-programming-in-c-5-0-part-two-whence-await.aspxThe 「await」 operator報價... means 「if the task we are awaiting has not yet completed then sign up the rest of this method as the continuation of that task, and then return to your caller immediately; the task will invoke the continuation when it completes.」