Ответ 1
При вызове асинхронного метода он будет работать асинхронно ли вы await
возвращаемый задание или нет.
await
не влияет на способ выполнения метода, только то, как вы с ним работаете. Вы можете вызвать метод async, получить задание и сразу же ждать (это самый простой вариант). Это позволит вам писать код, который выглядит синхронно, но выполняется асинхронно, так как await
основном регистрирует остальную часть кода после него, поскольку обратный вызов должен выполняться только после завершения ожидаемой задачи. Это не блокируется традиционным, так как нить не блокируется, но поток кода будет последовательным:
async Task LargerProcessAsync()
{
if (condition)
{
await ReportSomethingHappenedAsync();
}
// do other stuff
}
Однако вам не обязательно это делать. Вы можете вернуть задачу, сделать другие вещи и только потом await
:
async Task LargerProcessAsync()
{
Task task = null;
if (condition)
{
task = ReportSomethingHappenedAsync();
}
// do other stuff
if (task != null)
{
await task;
}
}
Или вы можете просто полностью удалить await
. Вы должны понимать, что это может быть опасно, поскольку задача может быть обвинена, и исключение может остаться ненаблюдаемым и почему оно не поощряется. Есть несколько способов сделать это правильно, но они не просты. Вы можете использовать Task.ContinueWith
:
void LargerProcess()
{
if (condition)
{
ReportSomethingHappenedAsync().ContinueWith(task =>
{
try
{
task.Wait();
}
catch (Exception exception)
{
// handle exception
}
})
}
// do other stuff
}
Или для ASP.Net смотрите Fire и Forget на ASP.NET