平行的.Foreach和Task冲突

本文关键字:Task 冲突 Foreach | 更新日期: 2023-09-27 17:52:48

我在并行执行中上传图像到云

// Make a TaskFactory that will use the UI thread's context
var uiFactory = new TaskFactory(TaskScheduler.FromCurrentSynchronizationContext());
Parallel.ForEach(FinalFileNames,
    new ParallelOptions { MaxDegreeOfParallelism = 4 },
    path =>
    {
         count++;
         /* Calculate percentage of upload done */
         double iPercentDone = (int)(((float)count / iTotalFiles) * 100);
        // Send the progress report to the UI thread.
        uiFactory.StartNew(() =>
        UploadProgress.Value = iPercentDone;
        LblProgress.Content = count.ToString(CultureInfo.InvariantCulture)
                               + " file(s) uploaded from " + iTotalFiles +
                     " file(s)";
                        }
       });

我面临的问题是,当我这样做时,UI被阻塞了。原因似乎是在同一个线程中工作。

如果我把这个平行。"Task.Factory"中的每一个。New",表示它正在进行异步调用,这不是我的要求。

请让我知道,我怎么能解决UI块问题,以及不使呼叫异步。

平行的.Foreach和Task冲突

当从UI线程启动时,Parallel.Foreach将阻塞UI线程直到完成,因此启动的任务将排队,但不会运行,直到UI线程返回其消息循环。

一种方法是使用Task.Run()在另一个线程中运行Parallel.Foreach,更好的方法是使用async/await与IProgress<T>结合使用 看

  • http://marcominerva.wordpress.com/2013/07/04/async-operations-and-progress-updates/comment-page-1/
  • http://tutorials.csharp-online.net/Progress_Reporting_Patterns