具有 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= 会使代码更清晰]
我正在尝试实现一个 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= 会使代码更清晰]