2013-05-06 54 views
0

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

号,当前线程将*不*睡眠只是因为它标志着等待句柄。但它可能会放弃它的其余时间段(这非常微妙和低级,不是你应该依赖的东西)。你不应该采取任何特殊行动。 – 2013-05-06 09:21:26

+0

那么是否有任何理由我不应该只使用锁定语句而不是EventWaitHandle? – Serge 2013-05-06 09:25:07

回答

2

号,当前线程将不只是因为它标志着等待句柄睡觉。但它可能会放弃它的其余时间段(这非常微妙和低级,不是你应该依赖的东西)。你不应该采取任何特殊行动。

可能是刚刚完成等待的线程线程优先级得到短暂提升。

this documentation for the Windows API function SetThreadPriorityBoost()从我引述:

当一个线程在动态优先级的一个运行时,系统可暂时提升线程的优先级时,它取出一个等待状态。

另请参阅this documentation

使刚刚从等待醒来的线程应该(通常)得到一个小的推动作用。我不完全确定这也适用于托管线程,但我似乎记得在某处阅读它。不过,我找不到这个来源。

+0

你是否建议我将“Thread.Sleep()”提升为“需要速度”的线程获取资源? – Serge 2013-05-06 09:27:00

+0

是的,在这种情况下'Thread.Sleep(0)'是一个有效的事情。它明确的意思是“放弃我当前的其余时间片”。只有参数值为零意味着 - 任何更大的意味着等待正常的时间。 – 2013-05-06 09:28:07

+0

然而注意,建议*用*是为[使用'睡眠(1)'而不是'睡眠(0)'](http://www.bluebytesoftware.com/blog/PermaLink,guid,1c013d42-c983- 4102-9233-ca54b8f3d1a1.aspx),但是[事情,因为Windows XP中更改(http://msdn.microsoft.com/en-us/library/windows/desktop/ms686298%28v=vs.85%29.aspx ),所以这不再是事实。你可能仍然想使用'Thread.Sleep(1)',但你应该测试你的版本,看它是否真的有帮助。 – 2013-05-06 09:41:50