gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:02:11 27 4
gpt4 key购买 nike

我有一个用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com