2013-05-13 2 views
5

У меня есть интерфейс IAnimation, который предоставляет метод BeginAsync(). Этот метод должен начать анимацию и вернуться, когда она будет завершена.Асинхронный метод, который ничего не делает

Что бы я хотел сделать, это реализовать класс анимации nullNoAnimation, который просто возвращается, когда он выполняет BeginAsync().

Это правильная реализация?

public async Task BeginAsync() 
{ 
    await Task.Run(() => { }); 
} 

Я подозреваю, что существует более элегантный подход, чем этот. Я также рассмотрел , создав пустой метод. Но это дает мне предупреждение, которое мне тоже не нравится.

+0

Связанный: [Создать завершенную задачу] (http://stackoverflow.com/q/14244114/1497596) – DavidRR

+1

Возможный дубликат [Если мой интерфейс должен возвращать задачу, то какой лучший способ иметь реализацию без операции? ] (http://stackoverflow.com/questions/13127177/if-my-interface-must-return-task-what-is-the-best-way-to-have-a-no-operation-imp) –

ответ

12

Просто используйте Task.CompletedTask вернуть завершенную задачу:

public Task BeginAsync() 
{ 
    return Task.CompletedTask; 
} 

Если у вас есть Task<TResult> использование Task.FromResult<TResult> вернуть завершенную задачу с результатом:

public Task<bool> BeginAsync() 
{ 
    return Task.FromResult(true); 
} 

Ваше текущее внедрение очень неэффективно, поскольку он создает конечный автомат, а также использует поток ThreadPool для запуска пустой задачи.

Смежные вопросы