web-dev-qa-db-ja.com

非同期/待機操作内で静的メソッド/クラスを使用するにはどうすればよいですか?

競合状態を防ぐためのロック手法が実装されていない限り、非同期操作内で静的メソッドとクラスを使用しないのが私のアプローチです。

現在、c#4.5+フレームワークにasync/awaitが導入されました。これにより、マルチスレッドアプリケーションが簡素化され、レスポンシブUIが促進されます。

しかし、ロックを待機中のメソッドに配置することはできません/すべきではないので(そして、私はそれについて議論していません)、それは非同期/待機を利用する静的メソッドを完全に冗長にしますか?

27

競合状態を防ぐためのロック手法が実装されていない限り、非同期操作内で静的メソッドとクラスを使用しないのが私のアプローチです。

どうして?実際に共有stateを使用している場合を除き、競合状態はありません。たとえば、次のことを考慮してください。

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

do共有状態の場合-または、複数のスレッドで使用されるインスタンスのinstanceメソッドの場合-理想的な方法を見つける必要があります- want動作する非同期操作。さまざまな人種の振る舞いを決定したら、実際に実装するのはかなり簡単です。

46
Jon Skeet