Подтвердить что ты не робот

Могу ли я использовать async без ожидания в С#?

Рассмотрим Использование async без ожидания.

думайте, что, может быть, вы неправильно поняли, что такое асинкс. Предупреждение точно вправо: если вы помечаете свой метод async, но не используете его в любом месте, тогда ваш метод не будет асинхронным. Если вы это называете, все код внутри метода будет выполняться синхронно.

Я хочу написать метод, который должен запускать async, но не нужно использовать await.for например при использовании потока

public async Task PushCallAsync(CallNotificationInfo callNotificationInfo)
{
    Logger.LogInfo("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId,
}

Я хочу вызвать PushCallAsync и запустить async и не хочу, чтобы ожидание было выполнено.

Можно ли использовать async без ожидания в С#?

4b9b3361

Ответ 1

Если ваш Logger.LogInfo уже асинхронный, этого достаточно:

public void PushCallAsync(CallNotificationInfo callNotificationInfo)
{
    Logger.LogInfo("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId,
}

Если это не просто запуск async, не дожидаясь его

public void PushCallAsync(CallNotificationInfo callNotificationInfo)
{
    Task.Run(() => Logger.LogInfo("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId));
}

Ответ 2

Вы по-прежнему недопонимаете async. Ключевое слово async не означает "запустить другой поток".

Чтобы направить некоторый код на другой поток, вам нужно сделать это явно, например, Task.Run:

await Task.Run(() => Logger.LogInfo("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId));

У меня есть async/await сообщение об открытии, которое может оказаться полезным.

Ответ 3

Если Logger.LogInfo является синхронным методом, весь вызов будет синхронным. Если все, что вы хотите сделать, это выполнить код в отдельном потоке, async не является инструментом для задания. Попробуйте вместо этого использовать пул потоков:

ThreadPool.QueueUserWorkItem( foo => PushCallAsync(callNotificationInfo) );

Ответ 4

Вы недопонимаете async. Это на самом деле просто говорит компилятору распространять инверсию потока управления, который он делает в фоновом режиме для вас. Так что весь стек метода помечен как async.

То, что вы действительно хотите сделать, зависит от вашей проблемы. (Давайте рассмотрим ваш вызов Logger.LogInfo(..) - это метод async, поскольку он в конечном итоге вызывает File.WriteAsync() или так.

  • Если вы вызываете функцию, это обработчик событий void, вы хороши. Асинхронный вызов произойдет в некоторой степени (а именно File.WriteAsync) в фоновом режиме. Вы не ожидаете какого-либо результата в вашем потоке управления. Это огонь и забыли.
  • Если вы хотите что-либо сделать с результатом или хотите продолжить только тогда, когда Logger.LogInfo(..) выполняется, вы должны принять меры предосторожности. Это тот случай, когда ваш метод каким-то образом находится посреди стека вызовов. Тогда Logger.LogInfo(..) обычно возвращает a Task и вы можете ждать. Но остерегайтесь вызова task.Wait(), потому что он будет блокировать ваш GUI-Thread. Вместо этого используйте ожидание или верните задачу (тогда вы можете опустить async):

public void PushCallAsync(CallNotificationInfo callNotificationInfo) 
{
   return Logger.LogInfo("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId); 
}

или

 public async void PushCallAsync(CallNotificationInfo callNotificationInfo) 
 {
    await Logger.LogInfo("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId); 
 }