[英]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);
如果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()
。 当using
块超出范围时, using
在示例中隐式调用Dispose()
。
这是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.