Где отлавливать исключения при использовании Task.ContinueWith?
Правильный ответ "не использовать ContinueWith
".Для асинхронного кода вы можете использовать await
вместо этого;для синхронного кода, подобного этому, вы можете просто ничего не использовать:
public async TaskCreateAndUploadAsync()
{
await Task.Run(async () =>
{
try
{
var _writeFile = new WriteFile(...);
_writeFile.DoWork();
storage.UploadCreatedObject(...);
}
catch (Exception e)
{
//Log..
}
});
}
Однако оборачивает тело метода в Task.Run
, как будто это антипаттерн ;лучше поддерживать метод синхронным и иметь вызывающих абонентов использовать Task.Run
:
public void TaskCreateAndUpload()
{
try
{
var _writeFile = new WriteFile(...);
_writeFile.DoWork();
storage.UploadCreatedObject(...);
}
catch (Exception e)
{
//Log..
}
}
Из названий ваших методов кажется, что некоторые из них должны быть асинхронными,Ввод / вывод по своей сути асинхронный.Итак, если у вас действительно асинхронный ввод-вывод (т. Е. Вы не используете Task.Run
для ложной асинхронности), тогда ваш результирующий метод может выглядеть следующим образом:
public async Task TaskCreateAndUploadAsync()
{
try
{
var _writeFile = new WriteFile(...);
await _writeFile.DoWorkAsync();
await storage.UploadCreatedObjectAsync(...);
}
catch (Exception e)
{
//Log..
}
}
Обратите внимание на использование await
вместоContiueWith
в последнем примере.