Запуск метода Task, который не ждет - PullRequest
0 голосов
/ 14 сентября 2018

Предположим, у меня есть следующий метод:

public async Task<bool> DoSomeStuffWithAsync()
{
   //do some stuff without calling await
   return true;
}

и я называю это так:

await DoSomeStuffWithAsync(); 

Работает ли это иначе, чем этот метод:

public bool DoSomeStuff()
{
   return true;
}

так называют:

DoSomeStuff();

Я думаю, что, поскольку DoSomeStuffWithAsync на самом деле не вызывает await в своем коде, он все равно будет работать так же, как DoSomeStuff.

Есть ли какая-то выгода в структурировании моего метода, как DoSomeStuffWithAsync?

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

В короткие сроки ключевое слово async не создает метод для асинхронной работы. Это позволяет только методу вызывать ключевое слово await внутри. Вот где происходит магия. В вашем случае у вас нет ни одного ключевого слова await, которое указывает на то, что ваш метод на самом деле не работает асинхронно.

0 голосов
/ 14 сентября 2018

Ваши методы возвращают разные вещи.DoSomeStuffWithAsync () возвращает Task<bool>.Вы можете вызвать его без ключевого слова «async» - синхронно - компилятор вернет bool в экземпляре Task<bool>, как только метод будет завершен - он сделает это за кулисами. И еще одно «отличие»как вы обрабатываете возвращаемое значение ...

var task = DoSomeStuffWithAsync(); // Synchronous call
Console.WriteLine(task.Result); // You must unpack the bool result...

Ваш другой метод просто возвращает bool - это просто стандартный синхронный вызов / возврат ...

var result = DoSomeStuff(); // Synchronous call
Console.WriteLine(result);  // Just use the result

Из поведенияс точки зрения, чтобы ответить на ваш конкретный вопрос, оба ведут себя синхронно. Другой способ взглянуть на это:

var act = new Func<Task<bool>>(async () => await DoSomeStuffWithAsync()); 
var result = act(); // will complete when DoSomeStuffWithAsync completes

Надеюсь, что это отвечает на ваш вопрос.

0 голосов
/ 14 сентября 2018

Обратите внимание, что использование async для метода, который не использует await, считается плохим стилем.Если у вас есть синхронный метод, который возвращает задачу, вы должны использовать Task.FromResult вместо:

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

Но да, вот и все: Синхронный метод, который возвращает задачу.Здесь нет ничего асинхронного, так что на самом деле это не работает иначе, чем обычный синхронный код, который просто возвращает bool.

Есть ли еще преимущество в возврате задачи вместо значения напрямую?Это зависит от.Иногда у вас может быть асинхронный интерфейс, который вам нужно реализовать, но на самом деле у вас нет асинхронной реализации для него.Но если вам не нужно этого делать, и если вы не планируете в конечном итоге изменить свою реализацию, чтобы сделать что-то асинхронно, то нет смысла заставлять ваш метод возвращать задачу.

Что касается вызова, await DoSomeStuffWithAsync() запустит DoSomeStuffWithAsync(), а затем дождется задачи, которую вернет.Поскольку DoSomeStuffWithAsync() является синхронным, задание будет возвращено напрямую, а поскольку задание уже выполнено, await сможет непосредственно продолжить.Так что это будет очень похоже на синхронный вызов метода.Однако наличие этого await оказывает влияние на поведение во время выполнения, поскольку это сделает этот вызывающий метод фактически асинхронным (даже если вызываемый код является синхронным).

Но решать вам, стоит лиэто уместно в вашем случае.В общем, вам, вероятно, следует избегать появления асинхронности, если в ней не задействован настоящий асинхронный процесс.

...