C# 是否执行EventWaitHandle。是否设置唤醒另一个正在等待的线程?

C# 是否执行EventWaitHandle。是否设置唤醒另一个正在等待的线程?,c#,multithreading,task-parallel-library,C#,Multithreading,Task Parallel Library,关于EventWaitHandle.Set,我不太确定。 当从当前线程中调用并且有另一个线程在等待事件时,当前线程是否进入睡眠状态,以便其他线程尽快运行 我这样问是因为在我的一些代码中,我必须向“线程共享”队列添加一些对象,并且该操作必须尽快进行。但在使用该队列的另一个线程中,速度“不是必需的”。 所以我是这样进行的: // Speed "not required" mailThread = new Task(() => {

关于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();
        });

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

这种情况可能是,刚刚完成等待的线程将获得线程优先级的短暂提升

见我引述的:

当线程在其中一个动态优先级类中运行时,系统会在线程脱离等待状态时临时提升其优先级

另见


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

不,当前线程不会休眠,因为它发出等待句柄的信号。但它可能会放弃其剩余的时间片(这是相当微妙和低级的,你不应该依赖它)。您不需要采取任何特殊操作。那么有什么理由我不应该只使用lock语句而不使用EventWaitHandle吗?您是否建议我使用“Thread.Sleep()”来提高OOD“速度要求”线程获得资源?是的,
Thread.Sleep(0)
在这种情况下是有效的。它明确地表示“放弃我当前剩余的时间片”。只有一个参数值为零意味着——任何较大的值都意味着要像正常情况一样等待那么长的时间。然而,请注意,以前的建议是这样的,然而,这不再是真的。您可能仍然希望使用
Thread.Sleep(1)
,但是您应该对构建进行测试,看看它是否真的有用。