2011-02-18 77 views
12

在同步世界,C#,使一切事物的管理一次性真的相當容易:故障安全處置異步世界

using(IDisposable someDisposable=bla.bla()) 
{ 
    //do our bidding 
} 
//don't worry too much about it 

然而,當我們去異步,我們不再有using塊的便利。我遇到的最佳策略之一是CCR iterator,它允許我們使用異步代碼「就好像它是同步的」。這意味着我們可以將我們的using塊保留在迭代器處理程序中,並且不會陷入複雜的決定何時處置和捕獲所有需要處理的情況。

然而,在很多情況下,調用CCR看起來像是過度殺傷了,老實說,雖然我對CCR很滿意,但對於外行來說,它可以看起來像是雙重荷蘭人。

所以我的問題是:什麼其他策略存在的一個人的IDisposable的管理,當一次性對象必須堅持超越直接範圍?

+0

好問題。我只發佈這條評論,所以我可以再次找到它。 – MusiGenesis 2011-02-18 00:15:25

+1

@MusiGenesis:「最喜歡」這個問題讓它容易找到更合理嗎? – Gabe 2011-02-18 01:59:06

回答

0

事實證明,這個問題也出現在語言設計師的頭腦中。

正確回答這個問題,現在是使用已經提供了幾乎所有異步操作異步的API,再加上新的C#async/await關鍵字Task基礎版本。這些允許我們在異步操作的整個生命週期內保持一切範圍:

async Task<int> DoSomething() 
{ 
    using(var foo = new SomeDisposableThing()) 
    { 
     await foo.DoSomethingAsync(); 
    } 
    return 0; 
} 
1

一種方法是讓所有不能與處置方法共存的方法在運行時鎖定,並在隊列完成時檢查隊列中是否需要處理的對象。然後,處理方法可以將其自身添加到隊列中,使用TryEnter嘗試獲取鎖,處理該對象並在成功時將其從隊列中刪除,或者讓鎖的當前持有者處理該處置。