延迟并唤醒任务被执行? (Task.Delay?)

时间:2015-06-28 05:20:35

标签: c# multithreading scheduled-tasks task scheduling

我的情况是我一次执行多个线程。在某些情况下,这些线程将被放入while()循环中一段未知的时间,如果在此循环中捕获了一定数量的线程,那么最终调度程序将停止让其他线程被执行。

我想知道是否有某种方法可以延迟执行一个线程(从预定列表中删除它)然后让其他线程进入。是否可以稍后通过threadID唤醒该线程或类似的东西是什么?

我正在阅读有关Task.Delay的内容,并看到它暂停执行时间,并且可以在无限时间内计算出某些内容,但是可以无限期地将其计时,直到事件发生,然后取消延迟它是用某个名字还是ID?

编辑:我认为这个问题更难以发布代码,但或多或​​少我的情况是请求进入并被放入循环中:

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

我注意到,当我发送大量请求时,我从未停止过仍然在他的循环中(我理解),但似乎可以做到这一点的最大线程数是16/32(取决于我运行它的计算机,它正在阻止其他请求被安排运行。

我想知道如果在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()循环,可以“做一些事情”,然后唤醒需要受影响的线程通过'事物'。有没有办法睡眠和唤醒特定线程,以便可以安排其他线程运行?

1 个答案:

答案 0 :(得分:1)

从这个问题我猜你正在运行一个繁忙的等待循环。你发现这很糟糕。

让循环等待事件:

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

这需要来自使事件发生的线程(或组件)的合作。您可以使用ManualResetEventTaskCompletionSource来实现此协调。

我不能更具体,因为问题并不是特别具体。我希望这会把你推向正确的方向。