2015-06-28 45 views
3

我有一種情況,我一次執行多個線程。在某些情況下,這些線程將被放置在while()循環中一段未知的時間,並且如果在此循環中捕獲了一定數量的線程,那麼調度程序最終會停止讓其他線程執行。延遲並喚醒正在執行的任務? (Task.Delay?)

我想知道是否有某種方式可以延遲執行線程(將它從預定列表中移除),然後讓其他線程進入。然後是否可以稍後通過線程ID或某事喚醒該線程像那樣?

我在閱讀有關Task.Delay並看到它暫停執行的時間範圍,並且有可能爲無限次的時間計時,但是是否有可能無限地計時直到事件​​發生,然後通過某個名稱或ID取消它?

編輯:我想這個問題是一個更難張貼代碼,但或多或​​少我有一種情況,請求進來,放入一個循環,如:

while(true){ 
    //check for something that could make me want to delete this thread/request 
    //do some things 
} 

我注意到當我發送大量的請求時,我從來沒有停止過,但仍然在他的循環中(我知道),但似乎可以做到這一點的線程的最大數量是16/32(取決於我的計算機,我運行它on),並阻止其他請求被安排運行。

我想知道,如果while()循環裏面我可以做這樣的事情:

while(true){ 
    //put this thread to sleep 
    //do some things that 
    //call some function to wake up the specific thread I need to do work on, before I put it back to sleep 
} 

在此的差別現在是不是16/32線程上運行,我可以有1「王線程「進入這個while()循環可以」做一些事情「,然後喚醒需要受到'事物'影響的線程。是否有辦法睡覺並喚醒特定線程,以便可以安排其他線程運行?

+0

沒有代碼,很難確切地告訴你想要做什麼,但可能[Monitor.Wait(Object)](https://msdn.microsoft.com/en-us/library/ateab679(v = vs .110).aspx)是你在找什麼? – sstan

+0

對不起,我添加了更多解釋。 – Pipeline

回答

1

從這個問題我猜你正在運行一個繁忙的等待循環。你發現這很糟糕。

使循環等待事件:

while (true) { 
WaitForEvent(); 
DoWork(); 
} 

這需要從線程(或部件),使事件發生合作。您可以使用ManualResetEventTaskCompletionSource來進行協調。

我真的不能更具體,因爲問題不是特別具體的情況。我希望這會把你推向正確的方向。

+0

所以你的說法做了一個等待事件的異步方法,這樣線程就會被捕獲,而不是一遍又一遍地循環? – Pipeline

+0

它不一定是異步的,但它應該以某種形式等待。 – usr