Согласно исходному коду GetTickersWebSocket
не является блокирующим вызовом.
Единственный блокирующий вызов, который вы отправили, - Console.ReadLine
.ExchangeBinanceAPI
имеет свою собственную асинхронность на основе обратного вызова, поэтому просто отбросьте Console.ReadLine
или поместите перед ней больше кода:
static async Task MainAsync()
{
ExchangeBinanceAPI b = new ExchangeBinanceAPI();
using (var socket = b.GetTickersWebSocket((tickers) =>
{
Console.WriteLine("{0} tickers, first: {1}", tickers.Count, tickers.First());
}))
{
// code continues here
Console.WriteLine("Press ENTER to shutdown.");
Console.ReadLine();
}
}
В качестве примечания.
Я не знаком с этим проектом , но исходный код показывает асинхронность бедняка внутри WebSocketWrapper
:
Task.Factory.StartNew(ListenWorkerThread)
// inside ListenWorkerThread
_ws.ConnectAsync(_uri, CancellationToken.None).GetAwaiter().GetResult();
result = _ws.ReceiveAsync(receiveBuffer, _cancellationToken).GetAwaiter().GetResult();
и т. Д.
Тамэто попытки вызвать асинхронный код синхронным способом.
Вместо этого, по крайней мере, ListenWorkerThread
должен быть преобразован в метод async
, и его определенно нельзя вызывать с помощью Task.Factory.StartNew
.
Iотправил бы запрос на переписывание кода в истинно асинхронном режиме, если бы мне пришлось использовать этот проект.