C# 什么与C中的Windows API CreateEvent函数等效# 我有一个C++中跨线程事件信号的例子。 HANDLE WriteCompleted = CreateEvent(NULL, FALSE, FALSE, NULL); SetEvent(WriteCompleted); WaitForSingleObject(pThis->WriteCompleted, INFINITE); CloseHandle(WriteCompleted);
如果SetEvent()设置该事件,那么什么会清除该事件?WaitForSingleObject()是否在返回时清除此事件C# 什么与C中的Windows API CreateEvent函数等效# 我有一个C++中跨线程事件信号的例子。 HANDLE WriteCompleted = CreateEvent(NULL, FALSE, FALSE, NULL); SetEvent(WriteCompleted); WaitForSingleObject(pThis->WriteCompleted, INFINITE); CloseHandle(WriteCompleted);,c#,c++,C#,C++,如果SetEvent()设置该事件,那么什么会清除该事件?WaitForSingleObject()是否在返回时清除此事件 使用C#实现相同想法的方法是什么 C#中的等效值可以通过ManualResetEvent实现 using(var WriteCompleted = new ManualResetEvent(false)) { WriteCompleted.Set(); //causes threads blocked on WaitOne() to proceed WriteC
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
,表示此事件更接近于模拟自动重置事件
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
}
无论最终如何实现它,都不要忘记在某个时候对对象调用Dispose()
<当using
块超出范围时,示例中将隐式调用code>Dispose()
下面是AutoResteEvent更具体的示例用法:
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()
,以使其再次阻止线程。看看WaitHandle
,它应该与您尝试执行的操作有些类似。或者ManualResetEvent
这与其说是事件处理,不如说是进程同步。文档是一个很好的起点。您创建了一个自动重置事件,这是CreateEvent()的第二个参数。因此,只需使用WaitForSingleObject()等待它就足以重置它。否则,您将考虑ReSETEVER()。如果您仅将事件用于一个事件,这两者都不重要,就像您在这里所做的那样。这很常见。NET有AutoResetEvent,做完全相同的事情。谢谢,我会试试这个。WriteCompleted.Dispose()是否也应该在using中的括号内?@Nazusing
在对象超出范围时自动阻止调用Dispose()。如果using块中没有该事件(可能不会),则需要显式调用Dispose()
。我添加了一个更具体的示例。我创建了一个新的AutoResetEvent,正如您在PublicMyClass中所说的。然后,从myThread()调用myFunction(),这两个函数都在myClass内。event.set()位于myFunction()内部,但由于某些原因,它没有.Dispose()字段,因此我使用了.Close()字段。此外,当我运行应用程序时,它会抛出一个“mscorlib.dll中发生的“System.ObjectDisposedException”类型的未处理异常其他信息:安全句柄已关闭”。你知道我做错了什么吗?@Naz嗯,例外情况是“把手已经关闭”。我猜这意味着您在调用close之后再次尝试使用该事件。就像Win32中的CloseHandle
一样,在处理完对象之前,您不希望对对象调用Close()
或Dispose()
。您应该在您的myClass
中实现IDisposable
,并在处理完整个类后进行处理。C#中的一次性模式有很多。