C# 下面的代码将文件上传到ftp并返回文件和字节数,如何使其并行运行? private异步任务上传(Ftp-ftpHost) { //var资产负债表 var uploadeOrderFileByteCount=0; var uploadedOrderFileCount=0; foreach(资产估值中的var fi,其中(fi=>fi.Exists)) { 上载OrderFileCount++; var count=ftp.Upload(fi); UploadeOrderFileByteCount+=等待计数; fi.删除(); } }

C# 下面的代码将文件上传到ftp并返回文件和字节数,如何使其并行运行? private异步任务上传(Ftp-ftpHost) { //var资产负债表 var uploadeOrderFileByteCount=0; var uploadedOrderFileCount=0; foreach(资产估值中的var fi,其中(fi=>fi.Exists)) { 上载OrderFileCount++; var count=ftp.Upload(fi); UploadeOrderFileByteCount+=等待计数; fi.删除(); } },c#,C#,您可以通过使用任务执行简单的异步并行。当所有: private async Task Upload(Ftp ftpHost) { //var assetImages is List<FileInfo> var uploadedOrderFileByteCount = 0; var uploadedOrderFileCount = 0; foreach (var fi in assetImage

您可以通过使用
任务执行简单的
异步
并行。当所有
:

  private async Task Upload(Ftp ftpHost)
     {
         //var assetImages is List<FileInfo>  
         var uploadedOrderFileByteCount = 0;
         var uploadedOrderFileCount = 0;

         foreach (var fi in assetImages.Where(fi => fi.Exists))
         {
             uploadedOrderFileCount++;

             var count = ftp.Upload(fi);

             uploadedOrderFileByteCount += await count;
             fi.Delete();
         }
     }
private异步任务上传(Ftp-ftpHost)
{
//var资产负债表
var uploadTasks=assetImages.Where(fi=>fi.Exists)。选择(async fi=>
{
var ret=等待ftp.Upload(fi);
fi.删除();
返回ret;
}).ToArray();
var counts=等待任务.WhenAll(上传任务);
var uploadedOrderFileByteCount=counts.Sum();
var uploadedOrderFileCount=counts.Count();
}

看看这个简单的
Parallel.ForEach()
示例:谢谢Stephen,我将您的代码放入try catch并进行了测试,发现如果任何上传任务失败,例如取消,计数将为0。如何忽略任何一个失败的上传,直到所有上传完成,然后只计算完成的任务?使用我上面提供的代码,如果任何任务失败,那么计数甚至没有定义(因此它们不会是0或任何其他值)。如果要观察所有任务,请在等待任务之后遍历
uploadTasks
。whalll(uploadTasks)
引发异常。谢谢Stephen。我将添加代码,以仅统计完成的任务并忽略失败的任务。
private async Task Upload(Ftp ftpHost)
{
   //var assetImages is List<FileInfo>  

   var uploadTasks = assetImages.Where(fi => fi.Exists).Select(async fi =>
   {
      var ret = await ftp.Upload(fi);
      fi.Delete();
      return ret;
   }).ToArray();
   var counts = await Task.WhenAll(uploadTasks);
   var uploadedOrderFileByteCount = counts.Sum();
   var uploadedOrderFileCount = counts.Count();
}