等待自动重置事件

等待自动重置事件

问题描述:

AutoResetEvent 的异步(等待)等价物是什么?

What would be the async (awaitable) equivalent of AutoResetEvent?

如果在经典的线程同步中我们会使用这样的东西:

If in the classic thread synchronization we would use something like this:

    AutoResetEvent signal = new AutoResetEvent(false);

    void Thread1Proc()
    {
        //do some stuff
        //..
        //..

        signal.WaitOne(); //wait for an outer thread to signal we are good to continue

        //do some more stuff
        //..
        //..
    }

    void Thread2Proc()
    {
        //do some stuff
        //..
        //..

        signal.Set(); //signal the other thread it's good to go

        //do some more stuff
        //..
        //..
    }

我希望在新的异步做事方式中,会变成这样:

I was hoping that in the new async way of doing things, something like this would come to be:

SomeAsyncAutoResetEvent asyncSignal = new SomeAsyncAutoResetEvent();

async void Task1Proc()
{
    //do some stuff
    //..
    //..

    await asyncSignal.WaitOne(); //wait for an outer thread to signal we are good to continue

    //do some more stuff
    //..
    //..
}

async void Task2Proc()
{
    //do some stuff
    //..
    //..

    asyncSignal.Set(); //signal the other thread it's good to go

    //do some more stuff
    //..
    //..
}

我见过其他定制的解决方案,但我设法得到的解决方案在某个时间点仍然涉及锁定线程.我不希望这只是为了使用新的 await 语法.我正在寻找一种真正的可等待信号机制,它不会锁定任何线程.

I've seen other custom made solutions, but what I've managed to get my hands on, at some point in time, still involves locking a thread. I don't want this just for the sake of using the new await syntax. I'm looking for a true awaitable signaling mechanism which does not lock any thread.

我在任务并行库中缺少什么吗?

Is it something I'm missing in the Task Parallel Library?

澄清一下:SomeAsyncAutoResetEvent 是一个完全构成的类名,在我的示例中用作占位符.

Just to make clear: SomeAsyncAutoResetEvent is an entirely made up class name used as a placeholder in my example.

如果您想构建自己的,Stephen Toub 有关于这个主题的权威博客文章.

If you want to build your own, Stephen Toub has the definitive blog post on the subject.

如果你想使用已经写好的一个,我的 AsyncEx 库中有一个一>.AFAIK,在撰写本文时没有其他选择.

If you want to use one that's already written, I have one in my AsyncEx library. AFAIK, there's no other option as of the time of this writing.