2012-10-24 18 views
17

這是我的方法,不要在異步操作中使用靜態方法和類 - 除非實現一些鎖定技術來防止競爭條件。如何在異步/等待操作中使用靜態方法/類?

現在異步/等待已經引入到c#4.5+框架中 - 它簡化了多線程應用程序並鼓勵響應式用戶界面。

但是 - 作爲一個鎖不能/不應該被放置在等待方法(我不辯論那個),現在是否使靜態方法利用異步/等待完全多餘?

+0

如果它沒有任何副作用,從多線程調用靜態方法將會很好。 –

+0

如果一種方法有副作用,那麼它首先不應該是靜態的,因爲它違反了應該避免全局可變狀態的指導原則。 – CodesInChaos

+0

@CodesInChaos我不認爲你可以*違反*準則;-)無論哪種方式,我試圖做的是大多數靜態方法不需要鎖定,除非某種共享狀態正在發生變化。 OP沒有在這方面提供足夠的信息,似乎意味着鎖定,因爲它是靜態的,而不是鎖定狀態管理。 –

回答

31

這是我的方法,不要在異步操作中使用靜態方法和類 - 除非實現某些鎖定技術來防止競爭條件。

爲什麼?除非你實際使用共享狀態,否則不應該有任何競爭條件。例如,考慮:

public static async Task<int> GetPageLength(string url) 
{ 
    string text = await new WebClient().DownloadStringTaskAsync(url); 
    return text.Length; 
} 

如果已經共享狀態 - 或者,如果你在一個實例的實例方法這是通過使用多線程是 - 你需要找出你將如何理想情況下您的異步操作才能正常工作。一旦你決定了各種種族應該如何表現,實際執行它可能相當簡單。

+0

道歉 - 我實際上是指具有共享狀態的靜態方法 - 將更新我的問題以提供示例 –

+2

@PatrickMcCurley:在這種情況下,問題的「靜態」不是那麼多 - 這是「多個線程想要使用相同的共享狀態「。當實例在各個狀態之間共享時,可以在實例成員中輕鬆實現。 –

+1

實際上想過你的原始答案我開始懷疑我對靜態方法被調用時會發生什麼的理解。如果在靜態方法中聲明局部變量,並且2個線程同時輸入靜態方法 - 是否可能不會導致本地聲明對象的爭用條件? –