2011-06-30 17 views
2

私はタスクを返すメソッドがあり、内部条件が真であればタスクは終了します。 ので、コードは次のようになります。どのようにC#でメソッドを記述すれば、条件が真であるかを返しますか?

public Task<Result> Method(int numberOfAggregats){ 
    return new Task<Result>(() => "return result once 
       aggregated information > numberOfAggregates"); 
} 

は、すべてのCPUやのThread.sleepを食べるループせずにこれを行うには、いくつかの方法はありますか?

さらに詳しい情報:私はクラスの目的は、wcfクエリを介してサーバーに入る情報を集約することです。これは "Method"メソッドを含むクラスです。 このメソッドは、集約された情報を必要とするバックグラウンド・ワークだけでなく、uiによって呼び出されます。

これまで、メソッドにコールバックアクションを渡していましたが、これはすべての情報が一度呼び出されると呼び出されました。タスクを返す背後にあるアイデアは、依存するモジュールのコードを複雑にするので、コールバックを取り除くことです。

+0

を作るかもしれない、あなたは条件を制御していますか?ときにはそれが唯一の方法です。つまり、それがあなたのコントロールから外れていて、いつ起こるのか分かりません。それ以外の場合は、実際にそのようなケースを避けるようにしてください – bevacqua

+0

はい私は条件を制御している。条件変数は同じクラスにあります。問題は、別のスレッドからbeeingが設定されてから、条件が真になるのにどれくらい時間がかかるか分かりません。それはどこからでも1秒から10分までかかります – LDomagala

答えて

2

使用AutoResetEvent:待ちタスクの呼び出し_notifier.WaitOne();

System.Threading.AutoResetEvent _notifier = new AutoResetEvent(false);

  • ので、それが信号を受信するまでブロックします。

  • 内部状態がtrueになると、待機タスクが完了するように通知するために_notifier.Set();を呼び出します。

+0

これは非常に有望ですね、私はそれを調べます。ありがとうございます – LDomagala

+0

@LDomagala:それは価値がある..あなたは大歓迎です。 –

+0

それは私が必要としていたものでした。 – LDomagala

1

http://msdn.microsoft.com/en-us/library/system.threading.monitor.wait.aspx これは、条件付きの可変ロックです。タスクが完了すると、変数に信号を送ることができ、それが実行を開始します。

+0

私はそれについて考えました、そして、それは本当にうまく正常に収まるでしょう。問題は、通常、メソッドに入った同じスレッドによって条件がtrueに設定されないことです。私が理解する限り、モニターを離れると、最初にメソッドに入った同じスレッドで条件を設定するように制約されます。 – LDomagala

+0

私が知る限り、同じスレッドにする必要はありません。 –

+0

あなたは何を意味するのか分かりません。 would notあなたはちょうど言う:monitor.enter(conditionWaiter)のメソッドとタスクのMonitor.Wait(conditionWaiter)を呼び出します。 – LDomagala

1

おそらくIAsynchResult patternはあなたがTPLにcontinuationを使用しているので

探しているものであることは、かなり漠然とだより多くの意味

関連する問題