我正在尝试实现一个AutoResetEvent,它在使用Set方法发出信号时返回一个值。我尝试在isCancelled局部变量上使用易失性,但这会导致语法错误。我不想只为这个方法引入一个类字段。那么,是否有一种方法既可以设置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;
}发布于 2020-08-01 21:30:36
在我看来,您的示例看起来很好,除了一件事:在等待下一个订阅事件之后添加事件处理程序。从这里,我推断SubscribeAsync()应该会导致_client进入一个CancelOrderStatusReceived可能被触发的状态;但是如果在等待之后附加事件处理程序,那么您可能会错过该事件。
尝试倒置这两条语句,尽管_client中有任何其他内部活动,但它应该可以工作。
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。
发布于 2020-08-02 14:17:18
我正在尝试实现一个AutoResetEvent,它在使用Set方法发出信号时返回一个值。
如果您使用的是一种同步原语,并且发现自己在想“我希望它做其他事情”,那么这表明使用了不正确的同步原语。
"AutoResetEvent将值从Set传递给Wait“在我看来就像是生产者/消费者队列,例如BlockingCollection<T>。
但是,您发布的代码很有趣。它将使用异步方法中的同步同步原语,这会引发一个危险标志。在我看来,SubscribeAsync + CancelOrderStatusReceived方法是一种基于事件的异步模式(EAP),通过将其转换为基于任务的异步模式(TAP)可以使代码更加简洁。
https://stackoverflow.com/questions/63209570
复制相似问题