我不确定关于EventWaitHandle.Set的一些信息。 当从当前线程中调用并且有另一个线程正在等待事件时,当前线程是否进入睡眠状态,以便其他线程可以运行(尽快)?做EventWaitHandle.Set唤醒另一个等待线程?
我问,因为我的一些代码,我有一些对象添加到“线程共享”队列和操作具有真正去尽可能快。但在正在使用该队列的另一个线程中,速度是“不需要的”。 所以我继续这样的:
// 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();
});
号,当前线程将*不*睡眠只是因为它标志着等待句柄。但它可能会放弃它的其余时间段(这非常微妙和低级,不是你应该依赖的东西)。你不应该采取任何特殊行动。 – 2013-05-06 09:21:26
那么是否有任何理由我不应该只使用锁定语句而不是EventWaitHandle? – Serge 2013-05-06 09:25:07