Проблема здесь не в том, как запустить задачу async
без наблюдения, а в том, что вы делаете с исключениями. Я говорю это, потому что они могут появиться, когда задача будет очищена.
В идеале просто покажите следующему читателю, что он получает. Так как вы против использования async void
Вариант 1
// running an async method unobserved
Task.Run(async () =>
{
try
{
await DoSomethingAsync();
}
catch (Exception e)
{
// Deal with unobserved exceptions
// or there will be dragons
}
});
Примечание : это технически разгрузка (он потеряет контекст, ОСТЕРЕГАЙТЕСЬ), и async
лямда в любом случае делает его асинхронным, однако вам придется иметь дело с исключения в любом случае, хотя
Вариант 2 и более спорно
public async void DoSomethingFireAndForget()
{
try
{
await DoSomethingAsync();
}
catch (Exception e)
{
// Deal with unobserved exceptions
// or the will be dragons
}
}
Вариант 3 лучшее из обоих миров.
Примечание : Используйте все, что вам нужно, чтобы соблюсти исключения, например Action
ect
public static class TaskUtils
{
#pragma warning disable RECS0165 // Asynchronous methods should return a Task instead of void
public static async void FireAndForgetSafeAsync(this Task task, Action<Exception> onErrors = null)
#pragma warning restore RECS0165 // Asynchronous methods should return a Task instead of void
{
try
{
await task;
}
catch (Exception ex)
{
onErrors?.Invoke(ex);
}
}
}
Может быть Стивен Клири произойдет это позже и даст вам более красноречивое объяснение