Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么与C中的Windows API CreateEvent函数等效# 我有一个C++中跨线程事件信号的例子。 HANDLE WriteCompleted = CreateEvent(NULL, FALSE, FALSE, NULL); SetEvent(WriteCompleted); WaitForSingleObject(pThis->WriteCompleted, INFINITE); CloseHandle(WriteCompleted);_C#_C++ - Fatal编程技术网

C# 什么与C中的Windows API CreateEvent函数等效# 我有一个C++中跨线程事件信号的例子。 HANDLE WriteCompleted = CreateEvent(NULL, FALSE, FALSE, NULL); SetEvent(WriteCompleted); WaitForSingleObject(pThis->WriteCompleted, INFINITE); CloseHandle(WriteCompleted);

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

如果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
    ,表示此事件更接近于模拟
    自动重置事件

    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中的括号内?@Naz
    using
    在对象超出范围时自动阻止调用
    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#中的一次性模式有很多。