c# - 什么相当于 C# 中的 Windows API CreateEvent 函数

标签 c# 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()Dispose()using block 超出范围时在示例中隐式调用。

MSDN for ManualResetEvent

MSDN for AutoResetEvent

下面是一个更具体的 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() 才能再次阻止线程。

关于c# - 什么相当于 C# 中的 Windows API CreateEvent 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33046896/

相关文章:

c# - 嵌套using语句和微软代码分析

c# - 是否有编译时标志来有条件地指定运行时要求?

c++ - 为什么 ADL 不能使用未命名的 initializer_list?

c++ - OpenProcess 句柄对 ReadProcessMemory 无效

c++ - 在 Windows (MSVC) 上为 C++ 安装 VSCode

c# - 单击复选框时的 ASP.NET MVC 提交表单

c# - 在运行时检测接口(interface)的所有具体实现

c# - 获取 GridView 的单击行

c++ - cvCreateMat 内存泄漏(OpenCV)

c++ - 如何防止 C++ 中不同别名类型的组合?