创建ManualResetEvent
的多个实例,每个Thread
一个,并在每个Thread
例如Thread
中使用ManualResetEvent.WaitOne()
。
public void StartThreadA()
{
_mreA = new ManualResetEvent();
_threadA = new Thread(new ThreadStart(() =>
{
_mreA.WaitOne();
// Continue
});
}
当你甚至会发生,你就可以处理它,像这样:
private void OnSomeEvent()
{
_mreA.Set();
}
这是在规模非常有限的,如果你打算使用大量线程的,我会建议使用一个字典来查找每个线程的ManualResetEvent
。
更新
正如我现在知道你正在使用的线程队列,我会做类似如下:
private Queue<ManualResetEvent> _queuedThreads = new Queue<ManualResetEvent>();
public void EnqueueThread()
{
var mre = new ManualResetEvent();
var thread = new Thread(new ThreadStart(() =>
{
mre.WaitOne();
// Continue
});
_queuedThreads.Enqueue(mre);
}
private void OnEvent()
{
var mre = _queuedThreads.Dequeue();
mre.Set();
}
我编辑了你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 –
你如何确定哪个线程应该被解除阻塞? – Lukazoid
从就绪队列中弹出的线程将成为将被解除阻塞的线程。 – kabichan