質問
私はCCRを使用して、プロジェクト内のタスクの実行のタイムアウトを実装したいです。基本的に私はポートにアイテムを投稿したり、私はタスクまたはそれは長いいくつか設定された時間以上かかる場合はそのが稼働していることをスレッドを中止することができるようにしたいDispatcherQueueにタスクをエンキューするとき。私はこれを行うことができますどのように?
解決
あなたが求めているものを確認することができますか?あなたは、ディスパッチャで長寿命のタスクを実行していますか?スレッドを強制終了すると、CCRモデルを破るので、あなたはその作品や歩留まりを終了するスレッドに知らせることができるようにする必要があります。それは十分に速い仕上げされていない、あなたはタイマーをエンキューすることを選択するかもしれないループだと仮定します:
var resultTimeoutPort = new Port<DateTime>();
dispatcherQueue.EnqueueTimer(TimeSpan.FromSeconds(RESULT_TIMEOUT),
resultTimeoutPort);
及び遮断ねじ山がresultTimeoutPortに利用可能な基準を有することを確認します。ブロッキングループでは、終了条件のいずれかがあるかもしれない:
do
{
//foomungus amount of work
}while(resultTimeoutPort.Test()==null&&
someOtherCondition)
私は間違ってツリーを吠えていた場合より多くの情報を投稿してください。
他のヒント
あなたはCCRの先頭にスレッド(にThread.currentThread)を登録することができハンドラを「受信」(またはデリゲート経由でメソッドを呼び出す方法で)。次に、あなたの定期的なチェックを行うことができ、必要に応じて基本的に手動でスレッドを作成した場合、あなたがそれを行っているのと同じ方法を中止します。キャッチは、あなたがスレッドの固定数を使用して独自のMicrosoft.Ccr.Core.Dispatcherを使用している場合、私はあなたが(私のテストに基づいて)、それらを中止したら、戻ってそれらのスレッドを取得する方法があるとは思わないということです。あなたのディスパッチャは5つのスレッドを持っているのであれば、あなただけ投稿する前に5回を中止することができるでしょうもはや関係なく、タスクが登録されているかどうかの動作しません。あなたはCLRスレッドプールを使用してDispatcherQueueを構築する場合は、あなたが中止任意のCCRスレッドは自動的に置き換えられます、あなたはその問題を持っていません。 CCRのディスパッチャが推奨されますが、私は、見たものから、私は、CLRのスレッドプールを使用すると、このような状況で移動するための方法だと思います。