具有 Return 值的 AutoResetEvent

AutoResetEvent with Return Value

我正在尝试实现一个 AutoResetEvent,在使用其 Set 方法发出信号时 returns 一个值。我尝试在 isCancelled 局部变量上使用 volatile,但结果出现语法错误。我不想仅为此方法引入 class 字段。那么有没有一种方法既可以设置 AutoResetEvent 又可以获取布尔标志以了解操作是否成功?这是我的代码。

private async Task<bool> GetCancelOrderStatus(Pair pair)
{
    var autoResetEvent = new AutoResetEvent(false);
    var isCancelled = false;

    var options = new SubscribeOptions(SubscribeOptionNames.CancelOrderStatus);
    var subscribe = new Subscribe(new[] { pair }, options);

    await _client.SubscribeAsync(subscribe);

    _client.CancelOrderStatusReceived += (sender, args) =>
    {
        if (args.Message.Status == Status.Ok)
            isCancelled = true;

        autoResetEvent.Set();
    };

    autoResetEvent.WaitOne();

    return isCancelled;
}

除了一件事外,您的示例在我看来还不错:您在等待下一个订阅事件后添加了事件处理程序。从这里,我推断 SubscribeAsync() 应该会导致 _client 进入 CancelOrderStatusReceived 可能被解雇的状态;但是如果您在等待之后附加事件处理程序,那么您可能会错过该事件。

尝试颠倒这两个语句,尽管 _client 中有任何其他内部 activity,它应该可以工作。

private async Task<bool> GetCancelOrderStatus(Pair pair)
{
    var autoResetEvent = new AutoResetEvent(false);
    var isCancelled = false;

    var options = new SubscribeOptions(SubscribeOptionNames.CancelOrderStatus);
    var subscribe = new Subscribe(new[] { pair }, options);

    _client.CancelOrderStatusReceived += (sender, args) =>
    {
        if (args.Message.Status == Status.Ok)
            isCancelled = true;

        autoResetEvent.Set();
    };

    await _client.SubscribeAsync(subscribe);

    autoResetEvent.WaitOne();

    return isCancelled;
}

此外,如果事件 CancelOrderStatusReceived 仅在等待 SubscribeAsync 期间触发此操作,您可能会发现甚至不需要 AutoResetEvent

I am trying to implement an AutoResetEvent that returns a value when it is signaled with its Set method.

如果您正在使用一种同步原语并发现自己在想“我想让它做些别的事情”,那么这表明正在使用不正确的同步原语。

"AutoResetEvent 将值从 Set 传递到 Wait" 在我看来就像 producer/consumer 队列,例如 BlockingCollection<T>.

不过,您发布的代码很有趣。它最终使用来自异步方法的同步同步原语,这引发了一个危险信号。在我看来,SubscribeAsync + CancelOrderStatusReceived 方法是一种基于事件的异步模式 (EAP),converting this to Task-Based Asynchronous Pattern (TAP).[=18= 会使代码更清晰]