StockSharp

Форк
0
/
IConnectorAsyncExtensions.cs 
89 строк · 2.6 Кб
1
namespace StockSharp.BusinessEntities;
2

3
using System;
4
using System.Threading;
5
using System.Threading.Tasks;
6

7
using Ecng.Common;
8

9
using StockSharp.Messages;
10

11
/// <summary>
12
/// Async extensions for <see cref="IConnector"/>.
13
/// </summary>
14
public static class IConnectorAsyncExtensions
15
{
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>
22
	public static async ValueTask ConnectAsync(this IConnector connector, CancellationToken cancellationToken)
23
	{
24
		if (connector is null)
25
			throw new ArgumentNullException(nameof(connector));
26

27
		if (connector.ConnectionState != ConnectionStates.Disconnected)
28
			throw new ArgumentException($"State is {connector.ConnectionState}.", nameof(connector));
29

30
		var tcs = AsyncHelper.CreateTaskCompletionSource<ConnectionStates>();
31

32
		using var _ = cancellationToken.Register(() => tcs.TrySetCanceled());
33

34
		void OnConnected() => tcs.TrySetResult(ConnectionStates.Connected);
35
		void OnConnectionError(Exception ex) => tcs.TrySetException(ex);
36

37
		connector.Connected += OnConnected;
38
		connector.ConnectionError += OnConnectionError;
39

40
		try
41
		{
42
			connector.Connect();
43

44
			await tcs.Task;
45
		}
46
		finally
47
		{
48
			connector.Connected -= OnConnected;
49
			connector.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>
59
	public static async ValueTask DisconnectAsync(this IConnector connector, CancellationToken cancellationToken)
60
	{
61
		if (connector is null)
62
			throw new ArgumentNullException(nameof(connector));
63

64
		if (connector.ConnectionState != ConnectionStates.Connected)
65
			throw new ArgumentException($"State is {connector.ConnectionState}.", nameof(connector));
66

67
		var tcs = AsyncHelper.CreateTaskCompletionSource<ConnectionStates>();
68

69
		using var _ = cancellationToken.Register(tcs.SetCanceled);
70

71
		void OnDisconnected() => tcs.SetResult(ConnectionStates.Disconnected);
72
		void OnConnectionError(Exception ex) => tcs.SetException(ex);
73

74
		connector.Disconnected += OnDisconnected;
75
		connector.ConnectionError += OnConnectionError;
76

77
		try
78
		{
79
			connector.Disconnect();
80

81
			await tcs.Task;
82
		}
83
		finally
84
		{
85
			connector.Disconnected -= OnDisconnected;
86
			connector.ConnectionError -= OnConnectionError;
87
		}
88
	}
89
}

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.