C# 是否执行EventWaitHandle。是否设置唤醒另一个正在等待的线程?
关于EventWaitHandle.Set,我不太确定。 当从当前线程中调用并且有另一个线程在等待事件时,当前线程是否进入睡眠状态,以便其他线程尽快运行 我这样问是因为在我的一些代码中,我必须向“线程共享”队列添加一些对象,并且该操作必须尽快进行。但在使用该队列的另一个线程中,速度“不是必需的”。 所以我是这样进行的:C# 是否执行EventWaitHandle。是否设置唤醒另一个正在等待的线程?,c#,multithreading,task-parallel-library,C#,Multithreading,Task Parallel Library,关于EventWaitHandle.Set,我不太确定。 当从当前线程中调用并且有另一个线程在等待事件时,当前线程是否进入睡眠状态,以便其他线程尽快运行 我这样问是因为在我的一些代码中,我必须向“线程共享”队列添加一些对象,并且该操作必须尽快进行。但在使用该队列的另一个线程中,速度“不是必需的”。 所以我是这样进行的: // Speed "not required" mailThread = new Task(() => {
// 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();
});
不,当前线程不会因为发出等待句柄的信号而休眠。但它可能会放弃其剩余的时间片(这是相当微妙和低级的,你不应该依赖它)。你不需要采取任何特别行动 这种情况可能是,刚刚完成等待的线程将获得线程优先级的短暂提升 见我引述的: 当线程在其中一个动态优先级类中运行时,系统会在线程脱离等待状态时临时提升其优先级 另见
因此,刚刚从等待中醒来的线程(通常)应该会得到一点提升。我不完全确定这是否也适用于托管线程,但我似乎记得在某个地方读到过这一点。但是,我找不到它的来源。不,当前线程不会休眠,因为它发出等待句柄的信号。但它可能会放弃其剩余的时间片(这是相当微妙和低级的,你不应该依赖它)。您不需要采取任何特殊操作。那么有什么理由我不应该只使用lock语句而不使用EventWaitHandle吗?您是否建议我使用“Thread.Sleep()”来提高OOD“速度要求”线程获得资源?是的,
Thread.Sleep(0)
在这种情况下是有效的。它明确地表示“放弃我当前剩余的时间片”。只有一个参数值为零意味着——任何较大的值都意味着要像正常情况一样等待那么长的时间。然而,请注意,以前的建议是这样的,然而,这不再是真的。您可能仍然希望使用Thread.Sleep(1)
,但是您应该对构建进行测试,看看它是否真的有用。