2015-06-28 49 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