繁体   English   中英

相当于C#中的Windows API CreateEvent函数

[英]What would be the equivalent to the Windows API CreateEvent function in C#

我有一个C ++中的跨线程事件信令示例。

HANDLE WriteCompleted = CreateEvent(NULL, FALSE, FALSE, NULL);

SetEvent(WriteCompleted);
WaitForSingleObject(pThis->WriteCompleted, INFINITE);
CloseHandle(WriteCompleted);
  1. 如果SetEvent()设置事件,那么清除该事件的方法是什么? WaitForSingleObject()是否在返回时清除此事件?

  2. 使用C#实现相同想法的方法是什么?

C#中的等效项可以通过ManualResetEvent完成。

using(var WriteCompleted = new ManualResetEvent(false))
{
   WriteCompleted.Set(); //causes threads blocked on WaitOne() to proceed
   WriteCompleted.WaitOne(); //waits until the event is signaled
   WriteCompleted.Reset(); //causes threads to block on WaitOne() call
}

您还可以使用AutoResetEvent ,它在Set之后自动调用Reset 您在示例代码中创建的事件将bManualReset设置为FALSE指示此事件更紧密地模拟AutoResetEvent

无论最终如何实现,都不要忘记在某个时刻在对象上调用Dispose() using块超出范围时, using在示例中隐式调用Dispose()

适用于ManualResetEvent的MSDN

适用于AutoResetEvent的MSDN

这是AutoResetEvent的更具体的示例用法:

private static AutoResetEvent m_event = new AutoResetEvent(false);

private static void Main(string[] args)
{
   new Thread(() =>
   {
      m_event.WaitOne();
      Console.WriteLine("Signal received from main");
   }).Start();

   Console.WriteLine("Sending signal");
   Thread.Sleep(1000);
   m_event.Set();

   m_event.Dispose();
}

如果您想重用该事件,则在调用Set()之后,它将自动重置为阻塞状态,因为我们正在使用AutoResetEvent 使用ManualResetEvent您需要调用Reset()才能使其再次阻塞线程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM