【问题标题】:Delay and wake up a task from being executed? (Task.Delay?)延迟并唤醒正在执行的任务? (任务.延迟?)
【发布时间】:2015-09-14 18:42:04
【问题描述】:

我遇到了一次执行多个线程的情况。在某些情况下,这些线程将被置于一个 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
 }

现在的不同之处在于,我可以让 1 个“主线程”进入这个可以“做一些事情”的 while() 循环,然后唤醒需要受影响的线程,而不是运行 16/32 个线程通过“事物”。有没有办法让特定线程休眠并唤醒,以便安排其他线程运行?

【问题讨论】:

  • 没有代码,很难准确判断您要做什么,但也许Monitor.Wait(Object) 是您正在寻找的?
  • 对不起,我添加了更多解释。

标签: c# multithreading scheduled-tasks task scheduling


【解决方案1】:

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

让循环等待一个事件:

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

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

我真的不能更具体,因为这个问题对于场景并不是特别具体。我希望这能将您推向正确的方向。

【讨论】:

  • 所以你的说法是创建一个等待事件的异步方法,以便线程被捕获而不是一遍又一遍地循环?
  • 它不必是异步的,但它应该以某种形式等待。
猜你喜欢
  • 2013-11-11
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
  • 2015-12-29
  • 2017-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多