使用task.continuewith时在哪里捕获异常



我想创建一个具有创建文件的异步方法,并立即继续执行下载任务,该任务将创建的文件上传到云。这是此方法的外观:

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..
            }
          }
        });
}

我的问题是:我如何在每个任务中捕获每个任务的例外方式是正确正确的,还是我应该在整个"任务..task.continuewith"中使用一个尝试键块?

使用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..
  }
}

从您的方法名称中,听起来有些应该是异步的。I/O本质上是异步的。因此,如果您确实具有异步I/O(即,不使用Task.Run用于假氨基化),那么您所产生的方法可能会如下:

public async Task TaskCreateAndUploadAsync()
{
  try
  {                 
    var _writeFile = new WriteFile(...);
    await _writeFile.DoWorkAsync();
    await storage.UploadCreatedObjectAsync(...);
  }
  catch (Exception e)
  {
    //Log..
  }
}

请注意在最后一个示例中使用await而不是ContiueWith

最新更新