2009-07-13 11 views
1

CCRを使用するプロジェクトでタスクの実行にタイムアウトを実装したいと思います。基本的に私は項目をポートにポストするか、またはDispatcherQueueにタスクをエンキューするときに、設定された時間よりも時間がかかる場合は、タスクまたは実行中のスレッドを中断できるようにします。これどうやってするの?CCRスレッドタスクを中止するにはどうすればよいですか?

+0

Cool。ロボティクスの質問。 – Will

答えて

2

尋ねていることを確認できますか? Dispatcherで長寿命のタスクを実行していますか?スレッドを強制終了するとCCRモデルが壊れるため、作業を完了して処理するためにスレッドに信号を送る必要があります。それは十分に速い仕上げされていないループだと仮定すると、あなたはタイマーエンキューすることを選択するかもしれません:

var resultTimeoutPort = new Port<DateTime>(); 
dispatcherQueue.EnqueueTimer(TimeSpan.FromSeconds(RESULT_TIMEOUT), 
          resultTimeoutPort); 

をブロッキングスレッドがresultTimeoutPortに利用可能な基準を持っていることを確認します。ブロッキングループでは、終了条件の一つは、次のようになります。

do 
{ 
    //foomungus amount of work 
}while(resultTimeoutPort.Test()==null&& 
     someOtherCondition) 

私は間違ってツリーを吠えてる場合は詳細情報を投稿してください。

+0

あなたは正しい方向に向かっていますが、私はfoomungusの作業コードを変更する必要がないようにしようとしていました。また、そのコードにはループがない場合もありますが、時にはそれを試して完了したい場合や、できない場合は消えてしまいます。私はいくつかの読書をしてきたし、あなたが言ったようにモデルを壊すので、私が望む正確な振る舞いを得る方法がないように見える。 – SpaceghostAli

+0

本当に、スレッドを殺すことなく、私はあなたがすぐに救済するためにそれに信号を送ることに固執していると思います。あなたは何を達成しようとしていますか?おそらく、問題に取り組むには別の方法がありますか? – spender

0

スレッド(Thread.CurrentThread)は、CCRの「Receive」ハンドラの先頭に(またはデリゲートを介してメソッドを呼び出すメソッドに)登録できます。その後、定期的なチェックを行い、必要に応じて、手動でスレッドを作成した場合と同じ方法で中止することができます。キャッチは、固定数のスレッドで独自のMicrosoft.Ccr.Core.Dispatcherを使用すると、(テストに基づいて)中断した後にそれらのスレッドを戻す方法がないと思います。したがって、ディスパッチャーに5つのスレッドがある場合は、登録されたタスクに関係なく、投稿が機能しなくなるまでに5回だけ中断できます。ただし、CLRスレッドプールを使用してDispatcherQueueを作成すると、中止するCCRスレッドは自動的に置き換えられ、その問題は発生しません。私が見たところでは、CCRディスパッチャが推奨されていますが、CLRスレッドプールを使用するのがこのような状況になる方法だと思います。

関連する問題