Ваш образец мне нравится, за исключением одного: вы добавляете обработчик событий после ожидания следующего события подписки. Отсюда я делаю вывод, что 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
, если событие CancelOrderStatusReceived
запускается только во время ожидания SubscribeAsync
для этой операции.