似乎将 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/