gpt4 book ai didi

c# - 归零CountdownEvent

转载 作者:可可西里 更新时间:2023-11-01 08:09:25 28 4
gpt4 key购买 nike

我正在尝试使用 CountdownEvent 只允许线程在事件计数为零时继续,但我希望初始计数为零。实际上,我想要一个归零行为,即只要计数为零,就会发出事件信号,而当计数大于零时,线程就会等待。

我可以使用 0 初始计数初始化倒计时事件,但是当我尝试添加计数时,我得到 InvalidOperationException "CountdownEvent_Increment_AlreadyZero"。

是否有替代类或其他方式可以使用倒计时事件来避免此限制?

最佳答案

编辑

public void Dispatch()
{
using (var ev = new CountdownEvent(1))
{
foreach (var task in <collection_of_tasks_to_start>)
{
ev.AddCount();
// start *task* here. Don't forget to pass *ev* to it!
}

ev.Signal();
ev.Wait();
}
}

// task code
void Handler(CountdownEvent ev)
{
try
{
// do task logic
}
finally
{
ev.Signal();
}
}

为什么以及如何运作?

  1. 如果你还没有产生任何任务
    • 什么都不会发生,Dispatch 将正常完成。
    • ev.Signal 确保一旦 ev.Wait 被调用,计数器的初始值为 0Wait 不会阻塞执行
  2. 如果你产生了至少一个任务
    • 我们有两种情况需要考虑:快速和慢速运行的任务,并了解它们如何影响调用 ev.Wait() 时的执行。
      • 快速任务,即在我们到达终点之前将完成的任务。
        • ev.Wait() 处,情况等同于第 1 点。
      • 缓慢的任务,即在我们到达终点之前尚未完成的任务。
        • ev.Wait() 处,计数器不再等于 0,因为执行了所有 ev.AddCount() .因此,执行将继续执行。
        • 一旦所有正在运行的任务完成(并执行相应的 ev.Signal() 行),计数器下降到 0 并且执行恢复退出例程

原始答案

你写道:

I am performing an operation that will create an unknown number of child operations (not tasks or threads)

那么它们是什么?你应该这样做:

CountdownEvent ev;  public void foo() {    ev = new CountdownEvent(1);    foreach ( <task in tasks_to_start> ) {         ev.AddCount();         // enter code here which starts your task    }    ev.Signal();    ev.Wait();}public static void youtTask(CountdownEvent ev) {    // some work    // ...    // after all is done    ev.Signal();}

关于c# - 归零CountdownEvent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4388086/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com