supra7sky
@supra7sky

Оборачивание Event-based async code в Task-based. Почему лучше использовать TaskCompletionSource?

Есть сервис, написанный с использованием подхода EAP, с двумя методами (синхронный и асинхронный).
Нужно обернуть это все в TAP. Какой вариант предпочтительнее и почему?
1) Task.Factory.StartNew(action, cancellationToken), где в action оборачивается синхронный метод сервиса.
2) Использование TaskCompletionSource и оборачивать асинхронный метод.

1 вариант уже реализован, потому что быстрее и проще.
Стоит ли это переделать с использованием TaskCompletionSource?
  • Вопрос задан
  • 241 просмотр
Решения вопроса 1
valyansky
@valyansky
Программист
TaskCompletionSource обычно стоит использовать, когда нужно создать Task, но нет долго-работающего синхронного метода, который мы можем обернуть.
Например,
public Task<bool> StartServiceAsync()
{
	// вызываем метод, который отрабатывает быстро, 
	// но возвращает результат не сразу, а через неопределенное время
	// в своем событии _someService.ServiceStarted
	_someService.StartAsync();

	if (_serviceTcs != null) _serviceTcs.SetCanceled();
	_serviceTcs = new TaskCompletionSource<bool>();
	return _serviceTcs.Task;
}

private void OnServiceStarted(object sender, bool e)
{
	// При срабатывании события от сервиса завершаем ожидающую задачу
	if (_serviceTcs != null) _serviceTcs.SetResult(e);
}


В Вашем случае, скорее всего, реализация через TaskCompletionSource будет лишним усложнением
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы