2012-10-24 12 views
17

競合状態を防ぐためにいくつかのロック技術が実装されていない限り、非同期操作内で静的メソッドとクラスを使用しないことが私のアプローチです。async/await操作で静的メソッド/クラスを使用する方法

これで、async/awaitがc#4.5+フレームワークに導入されました。マルチスレッドアプリケーションを簡素化し、応答性の高いUIを奨励します。

しかし、ロックは待機メソッドの上に置くことはできません(そして、私は議論していません)。これで、非同期/完全に冗長を待っている静的メソッドが作成されるようになりますか?

+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つのスレッドが静的メソッドを同時に入力すると、ローカルで宣言されたオブジェクトの競合状態にならない可能性がありますか? –