2017-01-19 6 views
3

私はシングルトンクラスと別のクラス(クラスb)から設定されたプロパティを持っていますが、問題はありません。私はシングルトンクラスのプロパティが真になるまで、別のクラス(クラスa)を無期限に待たせたい。私はこれを可能にする最も効率的な方法を望んでいるので、私はタスクが理想的だと感じましたが、効果的にすべての作品をまとめることはできません。私はpoll.sleepをポーリングし、スリープし続けたいとは思わない。別のクラスのタスクを待っています

public class A 
{ 
    public static void Main(string[] args) 
    { 
     if(!Monitor.Instance.HasChanged) 
     { 
      //await until the task in the Monitor class is complete 
     } 
    } 
} 

public class Monitor 
{ 
    private static Monitor instance; 
    private bool _hasChanged; 
    private Monitor() { } 

    public static Monitor Instance 
    { 
     get 
     { 
      if (instance == null) 
      { 
       instance = new Monitor(); 
      } 
      return instance; 
     } 
    } 


    public bool HasChanged 
    { 
     get 
     { 
      return _hasChanged; 
     } 
     set 
     { 
      _hasChanged = value; 
      if (_hasChanged) 
      { 
       //kick off a task 
      } 
     } 
    } 
} 

public class B 
{ 
    private static readonly Monitor _instance; 
    public void DoSomething() 
    { 
     Monitor.Instance.HasChanged = true; 
    } 
} 

答えて

3

これにはTaskCompletionSourceを使用します。

これは、タスク完了ソースを設定し、値が変更されたときにタスクを完了します。あなたの質問から明らかではない

await Monitor.Instance.HasChangedTask; 

一つのことを、あなたは、タスクをリセットして対処する必要があります:あなたはとてもようにそれに待機していました。これを行うには、TaskCompletionSourceを再作成してください。

+0

ありがとう、私は明日これを確認します。私は本当に専門家ではないので、最後の質問が1つあります。 コンシューマは現在非同期メソッドではないため、問題が発生しています。メソッドを非同期にするのは簡単でしょうが、以前は非同期メソッドとして使用していた呼び出し元に影響しますか? – Roka

+0

@Roka通常は、コールチェーン全体を待っています。同期待機を望むなら、 'Task.Wait'は問題ありませんが、変数を変更しようとしているものをブロックしている可能性があることに注意してください。 – BradleyDotNET

関連する問題