Могу ли я использовать 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 без ожидания в С#?
Ответы
Ответ 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);
}