C# 并行。Foreach与任务冲突
我正在以并行方式将图像上载到云:C# 并行。Foreach与任务冲突,c#,asynchronous,task-parallel-library,parallel.foreach,C#,Asynchronous,Task Parallel Library,Parallel.foreach,我正在以并行方式将图像上载到云: // Make a TaskFactory that will use the UI thread's context var uiFactory = new TaskFactory(TaskScheduler.FromCurrentSynchronizationContext()); Parallel.ForEach(FinalFileNames, new ParallelOptions { MaxDegreeOfParallelism = 4 },
// 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被阻塞。原因似乎是同一条线索
如果我将这个Parallel.ForEach包装在“Task.Factory.New”中,那么它将进行异步调用,这不是我的要求
请让我知道,如何解决UI阻止问题,以及如何不使调用异步。并行。
从UI线程启动时,Foreach
将阻止UI线程直到完成,因此启动的任务将排队,但在UI线程返回其消息循环之前不会运行
一种方法是在另一个线程中使用Task.run()
运行Parallel.Foreach
,更好的方法是将async/wait与IProgress
看
并行。foreach
不适用于图像上传等IO绑定任务。一个类似的问题:@AdamHouldsworth-请查看编辑..我添加了uifactory定义..@Noseratio-但我看不出Parallel.Foreach有任何问题..我可以将其包装到任务..但问题就是我概述的..请建议您正确地需要在后台工作线程中运行Parallel.Foreach,为了避免阻塞UI线程,我认为这是一种异步方法,但我只想在上传文件后更新UI。如何实现在上传文件时不阻塞UI线程,这将使应用程序进入“无响应”状态。异步方法就是您所需要的。wait Task.Run(()=>{Parallel.Foreach(…)})