我有一个用 C++ 编写的跨线程事件信号示例。
HANDLE WriteCompleted = CreateEvent(NULL, FALSE, FALSE, NULL);
SetEvent(WriteCompleted);
WaitForSingleObject(pThis->WriteCompleted, INFINITE);
CloseHandle(WriteCompleted);
如果 SetEvent() 设置事件,那么什么清除该事件? WaitForSingleObject() 是否在返回时清除此事件?
使用 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 超出范围时在示例中隐式调用。
下面是一个更具体的 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/