Где ловить исключения при использовании Task.ContinueWith? - PullRequest
0 голосов
/ 14 марта 2019

Я хотел бы создать асинхронный метод с Task, который создает файл и сразу же приступает к выполнению следующей задачи, которая загружает созданный файл в облако. Вот как выглядит этот метод:

public async TaskCreateAndUploadAsync()
{
     await Task.Run(() =>
        {
            try
            {                 
                var _writeFile = new WriteFile(...);
                _writeFile.DoWork();
            }
            catch (Exception e)
            {
                //Log..
            }
        }).ContinueWith((result) =>
        {
        if (!result.IsFaulted)
            {
            try
            {
               storage.UploadCreatedObject(...);
            }
            catch (Exception e)
            {
                //Log..
            }
          }
        });
}

Мой вопрос таков: правильный ли способ отлова исключений в каждой задаче в отдельности, или я должен использовать один блок try-catch вокруг целого «Task..Task.ContinueWith»?

1 Ответ

1 голос
/ 14 марта 2019

Где отлавливать исключения при использовании 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 в последнем примере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...