Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.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#_Multithreading - Fatal编程技术网

C# 自动重置事件何时重置?

C# 自动重置事件何时重置?,c#,multithreading,C#,Multithreading,即使使用多年,我仍然无法理解AutoResetEvent是如何工作的 说到Set(),是否应该有一部分代码在某处等待WaitOne() 换句话说。。如果在WaitOne()之前成功调用了Set(),它是否会在WaitOne()之前自动重置,然后我将错过Set 或者换句话说,WaitOne()是否重置标志?来自: Set方法释放一个线程。如果没有等待 线程时,等待句柄保持有信号,直到线程尝试 等待它,或直到调用其重置方法 因此,要回答这些问题: 不必有WaitOne调用,Reset也将取消对句柄

即使使用多年,我仍然无法理解
AutoResetEvent
是如何工作的

说到
Set()
,是否应该有一部分代码在某处等待
WaitOne()

换句话说。。如果在
WaitOne()
之前成功调用了
Set()
,它是否会在
WaitOne()
之前自动重置,然后我将错过Set

或者换句话说,
WaitOne()
是否重置标志?

来自:

Set方法释放一个线程。如果没有等待 线程时,等待句柄保持有信号,直到线程尝试 等待它,或直到调用其重置方法

因此,要回答这些问题:

  • 不必有
    WaitOne
    调用,
    Reset
    也将取消对句柄的信号发送。(如果让一个类依赖于其他类的正确行为,那将是一个糟糕的设计
  • 句柄一直保持信号状态,直到在AutoResetEvent上调用线程等待句柄或重置。因此不会丢失集合。当两个线程等待时,可能会丢失集合。请参阅文档:
无法保证每次调用Set方法都会释放 如果两个调用靠得太近,那么第二个调用 在释放线程之前发生,仅释放一个线程 -就好像第二次调用没有发生一样。另外,如果在没有线程等待时调用Set方法,并且自动resetEvent 已发出信号,呼叫无效

  • WaitOne
    不会取消对句柄的信号发送,但并不是保证每次等待都会这样做(参见前面的备注)

从您的问题中,我得到的印象是,这将有助于您更仔细地阅读文档,也许您会看到.NET类包装了Windows事件对象。请参阅以获取有关如何使用事件对象的更多信息。

下一部分可能也值得引用:)如果两个线程在WaitOne()中,并且Set()发出了信号,那么两个线程都将被释放,或者只有一个线程首先收到Set()。一个线程将被释放,然后事件将被自动重置,因此命名。有一个等待线程的队列系统,但我不确定您是否可以访问它。@VitaliPetrov-我添加了更多到背景信息的链接。根据,它将发布一个线程。不要用新问题更新问题,这会弄乱网站的qa格式。只需发布一个新的、明确的问题