c# - 使用 Task.WhenAll() 时如何让所有任务完成?

标签 c#

似乎将 Task.WhenAll() 放在 try-catch block 中不起作用。代码应该将所有图像上传到 ftp,但似乎如果一个上传失败(例如,图像文件在另一个进程中打开),整个 uploadTasks 将停止,并且 counts 为空。

    private async Task Upload(Ftp ftpHost)
{
   var images = GetFileInfo() // will get a List<FileInfo>  

   var uploadTasks = images.Where(fi => fi.Exists).Select(async fi =>
   {
      var ret = await ftp.Upload(fi,_cancellationTokenSource.Token);
      fi.Delete();
      return ret;
   });
   IEnumerable<int> counts = new List<int>();
       try
       {
           counts = await Task.WhenAll(uploadTasks);
       }
       catch
       {
           //ignore to allow all upload complete 
       }

   var uploadedOrderFileByteCount = counts.Sum();
   var uploadedOrderFileCount = counts.Count();
}

最佳答案

除了一个空的 catch block 通常不是一个好主意( try catch ftp 上传可以特别抛出的异常)之外,如果那是你想做的,那么最简单的方法是在操作中捕获本身,类似于下面的代码。

var uploadTasks = images.Where(fi => fi.Exists).Select(async fi =>
{
    try
    {
        var ret = await ftp.Upload(fi,_cancellationTokenSource.Token);
        fi.Delete();
        return ret;
    } catch {
        // again, please don't do this...
        return 0;
    }
});
IEnumerable<int> counts = new List<int>();
try
{
    counts = await Task.WhenAll(uploadTasks);
}
catch
{
    // Something bad happened, don't just ignore it
}

关于c# - 使用 Task.WhenAll() 时如何让所有任务完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16554001/

相关文章:

c# - 在 WinForms 中添加验证而不使用 IDataErrorInfo

c# - 如何防止 SaveFileDialog 提示两次以替换/覆盖文件?

c# - MVC 中的转换错误

c# - Task.Run 支持取消

c# - OnMouseEnter 旋转变换

c# - 在作为 Windows 服务托管的 WCF 类库项目中使用 SqlDependency

c# - xxx 类型的方法 'Generate' 没有实现 - S#arp - 已更新

c# - 无法加载System.Threading.Tasks.Extensions

c# - 将 MDI 子菜单项合并到父菜单中

c# - 动态创建的按钮未触发按钮单击事件