我不确定有关EventWaitHandle.Set的事情。 当从当前线程中调用并且还有另一个线程在等待事件时,当前线程是否会进入休眠状态以便其他线程运行(ASAP)?
我问,因为在我的一些代码中,我必须将一些对象添加到“线程共享”队列中,并且该操作确实要尽可能快。但是在使用该队列的另一个线程中,速度是“不需要的”。 所以我这样做:
// Speed "not required"
mailThread = new Task(() =>
{
for (; ; )
{
MailMessage mail;
pushMailLockMREvt.WaitOne();
{
if (mails.Count == 0)
{
mail = null;
}
else
{
mail = mails.Dequeue();
}
}
pushMailLockMREvt.Set(); // Does this put current on sleep on lower it's priority??
if (mail != null)
{
try
{
MailClient.Send(mail);
}
catch (Exception exe)
{
}
}
else
{
mailSem.WaitOne();
}
}
});
[...]
// Speed required
var task = new Task(() =>
{
pushMailLockMREvt.WaitOne(); // ASAP please...
{
mails.Enqueue(mailMessage);
if (mails.Count == 1)
{
mailSem.Set();
}
}
pushMailLockMREvt.Set();
});
答案 0 :(得分:2)
不,当前线程不会因为它发出等待句柄信号而暂停。但它可能会放弃其余的时间片(这是非常微妙和低级别的,而不是你应该依赖的东西)。你不应该采取任何特别的行动。
可能就是刚刚等待的线程将获得线程优先级的短暂提升。
请参阅我引用的this documentation for the Windows API function SetThreadPriorityBoost()
:
当一个线程在其中一个动态优先级类中运行时,系统在退出等待状态时会暂时提升线程的优先级。
因此,从等待中醒来的线程应该(通常)得到一个小的提升。我不完全确定这也适用于托管线程,但我似乎记得在某个地方阅读它。但是我无法找到它的来源。