2009-07-13 54 views
1

我想在使用CCR的項目中執行任務的超時。基本上,當我將一個項目發佈到端口或將任務排入DispatcherQueue時,我希望能夠中止該任務或其運行的線程,如果這需要比配置的時間更長的時間。我怎樣才能做到這一點?如何中止CCR線程任務?

+0

很酷。機器人問題。 – Will 2009-07-13 16:38:28

回答

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工作代碼進行更改之外,您正朝着正確的方向前進。此外,該代碼可能並不總是有循環,有時我只是希望它在時間t嘗試並完成,如果不能,就離開。我一直在做一些閱讀,看起來可能沒有辦法獲得我想要的確切行爲,因爲我會按照你所說的打破模型。 – SpaceghostAli 2009-07-20 13:57:14

0

您可以在CCR「Receive」處理程序(或通過代理調用您的方法的方法)的開頭註冊線程(Thread.CurrentThread)。然後,如果需要,您可以進行定期檢查並在必要時放棄,這與您手動創建線程的方式基本相同。問題是,如果你使用你自己的Microsoft.Ccr.Core.Dispatcher和固定數量的線程,我不認爲有一種方法可以在你中止它們(基於我的測試)時返回這些線程。因此,如果您的調度程序有5個線程,那麼無論已註冊哪些任務,發佈將不再工作,您只能中止5次。但是,如果使用CLR線程池構造DispatcherQueue,則任何您中止的CCR線程都會自動替換,您不會遇到此問題。從我所看到的情況來看,雖然推薦使用CCR調度程序,但我認爲使用CLR線程池是在這種情況下的方法。