StockSharp
89 строк · 2.6 Кб
1namespace StockSharp.BusinessEntities;2
3using System;4using System.Threading;5using System.Threading.Tasks;6
7using Ecng.Common;8
9using StockSharp.Messages;10
11/// <summary>
12/// Async extensions for <see cref="IConnector"/>.
13/// </summary>
14public static class IConnectorAsyncExtensions15{
16/// <summary>17/// Async version <see cref="IConnector.Connect"/>.18/// </summary>19/// <param name="connector"><see cref="IConnector"/>.</param>20/// <param name="cancellationToken"><see cref="CancellationToken"/>.</param>21/// <returns><see cref="ValueTask"/>.</returns>22public static async ValueTask ConnectAsync(this IConnector connector, CancellationToken cancellationToken)23{24if (connector is null)25throw new ArgumentNullException(nameof(connector));26
27if (connector.ConnectionState != ConnectionStates.Disconnected)28throw new ArgumentException($"State is {connector.ConnectionState}.", nameof(connector));29
30var tcs = AsyncHelper.CreateTaskCompletionSource<ConnectionStates>();31
32using var _ = cancellationToken.Register(() => tcs.TrySetCanceled());33
34void OnConnected() => tcs.TrySetResult(ConnectionStates.Connected);35void OnConnectionError(Exception ex) => tcs.TrySetException(ex);36
37connector.Connected += OnConnected;38connector.ConnectionError += OnConnectionError;39
40try41{42connector.Connect();43
44await tcs.Task;45}46finally47{48connector.Connected -= OnConnected;49connector.ConnectionError -= OnConnectionError;50}51}52
53/// <summary>54/// Async version <see cref="IConnector.Disconnect"/>.55/// </summary>56/// <param name="connector"><see cref="IConnector"/>.</param>57/// <param name="cancellationToken"><see cref="CancellationToken"/>.</param>58/// <returns><see cref="ValueTask"/>.</returns>59public static async ValueTask DisconnectAsync(this IConnector connector, CancellationToken cancellationToken)60{61if (connector is null)62throw new ArgumentNullException(nameof(connector));63
64if (connector.ConnectionState != ConnectionStates.Connected)65throw new ArgumentException($"State is {connector.ConnectionState}.", nameof(connector));66
67var tcs = AsyncHelper.CreateTaskCompletionSource<ConnectionStates>();68
69using var _ = cancellationToken.Register(tcs.SetCanceled);70
71void OnDisconnected() => tcs.SetResult(ConnectionStates.Disconnected);72void OnConnectionError(Exception ex) => tcs.SetException(ex);73
74connector.Disconnected += OnDisconnected;75connector.ConnectionError += OnConnectionError;76
77try78{79connector.Disconnect();80
81await tcs.Task;82}83finally84{85connector.Disconnected -= OnDisconnected;86connector.ConnectionError -= OnConnectionError;87}88}89}