3
在接下來的一段代碼:在任務中,爲什麼IProgress <T>在UI線程中正確執行,但不是Action <T>?
Task UpdateMedias<TProperty>(Expression<Func<Media, TProperty>> property, Func<Media, TProperty> func)
{
var medias = GetSelectedMedias().ToList();
IProgress<double> progress = new Progress<double>(d => barQueueProgress.EditValue = d);
Action<Media, Expression<Func<Media, TProperty>>, Func<Media, TProperty>> action =
(media, expression, arg3) => UpdateMedia(media, expression, arg3);
Task task = Task.Run(() =>
{
var i = 0;
foreach (var media in medias)
{
progress.Report(1.0d/medias.Count * ++i);
action(media, property, func);
}
});
Task with = task.ContinueWith(s =>
{
progress.Report(0.0d);
GridControl1.RefreshData();
});
return with;
}
如果我不Dispatcher.BeginInvoke
包括action
將與抱怨,因爲不同的線程擁有它調用線程不能訪問該對象。,而對於progress
則不需要這樣做。
IProgress<T>
爲什麼不需要Dispatcher.BeginInvoke
?
這個答案幫助我理解了爲什麼對'progress.Report'的調用是有效的當它跟隨一個等待的'任務',配置爲'ConfigureAwait(false)'。此外,['Progress'](https://msdn.microsoft.com/en-us/library/hh193692(v = vs.110).aspx)文檔中的註釋確實確認了「 SynchronizingContext'實例,當'Progress '被構建時。 –
DavidRR