EventWaitHandle.Set唤醒另一个等待线程?

时间:2013-05-06 09:05:26

标签: c# multithreading task-parallel-library

我不确定有关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();
        });

1 个答案:

答案 0 :(得分:2)

不,当前线程不会因为它发出等待句柄信号而暂停。但它可能会放弃其余的时间片(这是非常微妙和低级别的,而不是你应该依赖的东西)。你不应该采取任何特别的行动。

可能就是刚刚等待的线程将获得线程优先级的短暂提升。

请参阅我引用的this documentation for the Windows API function SetThreadPriorityBoost()

  

当一个线程在其中一个动态优先级类中运行时,系统在退出等待状态时会暂时提升线程的优先级。

另见this documentation

因此,从等待中醒来的线程应该(通常)得到一个小的提升。我不完全确定这也适用于托管线程,但我似乎记得在某个地方阅读它。但是我无法找到它的来源。