首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有返回值的AutoResetEvent

具有返回值的AutoResetEvent
EN

Stack Overflow用户
提问于 2020-08-01 20:06:21
回答 2查看 298关注 0票数 0

我正在尝试实现一个AutoResetEvent,它在使用Set方法发出信号时返回一个值。我尝试在isCancelled局部变量上使用易失性,但这会导致语法错误。我不想只为这个方法引入一个类字段。那么,是否有一种方法既可以设置AutoResetEvent,又可以获得布尔标志,以知道操作是否成功?这是我的密码。

代码语言:javascript
复制
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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-01 21:30:36

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

尝试倒置这两条语句,尽管_client中有任何其他内部活动,但它应该可以工作。

代码语言:javascript
复制
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;
}

此外,如果事件AutoResetEvent仅在等待此操作的SubscribeAsync期间触发,则甚至不需要使用SubscribeAsync

票数 1
EN

Stack Overflow用户

发布于 2020-08-02 14:17:18

我正在尝试实现一个AutoResetEvent,它在使用Set方法发出信号时返回一个值。

如果您使用的是一种同步原语,并且发现自己在想“我希望它做其他事情”,那么这表明使用了不正确的同步原语。

"AutoResetEvent将值从Set传递给Wait“在我看来就像是生产者/消费者队列,例如BlockingCollection<T>

但是,您发布的代码很有趣。它将使用异步方法中的同步同步原语,这会引发一个危险标志。在我看来,SubscribeAsync + CancelOrderStatusReceived方法是一种基于事件的异步模式(EAP),通过将其转换为基于任务的异步模式(TAP)可以使代码更加简洁。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63209570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档