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

    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 будет лишним усложнением
    Ответ написан
    Комментировать