【发布时间】:2014-03-24 11:27:00
【问题描述】:
我正在以并行执行方式将图像上传到云:
// 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 阻塞问题以及不使调用异步。
【问题讨论】:
-
你试过Application.DoEvents();在每次 foreach 之后?
-
Parallel.ForEach不适用于图像上传等 IO 绑定任务。一个类似的问题:stackoverflow.com/q/22403856/1768303 -
@AdamHouldsworth - 请参阅编辑..我添加了 uifactory 定义..
-
@Noseratio - 但我在这里没有看到 Parallel.Foreach 有任何问题..我可以将它包装到一个任务中..但问题是我概述的..请告知
-
您需要在后台工作线程中正确运行您的 parallel.foreach,以避免它阻塞您的 UI 线程
标签: c# asynchronous task-parallel-library parallel.foreach