延迟并唤醒正在执行的任务? (任务.延迟?)

Posted

技术标签:

【中文标题】延迟并唤醒正在执行的任务? (任务.延迟?)【英文标题】: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) 是您正在寻找的? 对不起,我添加了更多解释。 【参考方案1】:

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

让循环等待一个事件:

while (true) 
 WaitForEvent();
 DoWork();

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

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

【讨论】:

所以你的说法是创建一个等待事件的异步方法,以便线程被捕获而不是一遍又一遍地循环? 它不必是异步的,但它应该以某种形式等待。

以上是关于延迟并唤醒正在执行的任务? (任务.延迟?)的主要内容,如果未能解决你的问题,请参考以下文章

延迟任务的几种高效解决方案

beego任务定时执行,延迟执行

使用 Task.Run() 时的延迟

Android 用主线程的Handler 延迟执行任务

基于消息队列(RabbitMQ)实现延迟任务

将 DAG 转换为任务的巨大延迟