0

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

1 に答える 1

2

いいえ、現在のスレッドは、待機ハンドルを通知するためだけにスリープしません。ただし、残りのタイムスライスを放棄する可能性があります (これは非常に微妙で低レベルであり、依存すべきものではありません)。特別な操作を行う必要はありません。

待機を終えたばかりのスレッドの優先度が一時的に上がる場合があります。

引用元の Windows API 関数については、次のドキュメントをSetThreadPriorityBoost()参照してください。

スレッドが動的優先度クラスの 1 つで実行されている場合、システムはスレッドが待機状態から抜け出すときに一時的にスレッドの優先度を上げます。

このドキュメントも参照してください。

したがって、待機から目覚めたばかりのスレッドは、(通常は) わずかなブーストを取得する必要があります。これがマネージドスレッドにも当てはまるかどうかは完全にはわかりませんが、どこかで読んだことを覚えているようです。しかし、そのソースが見つかりません。

于 2013-05-06T09:24:55.813 に答える