我正在使用TPL数据流在遵循MVVM模式的WPF应用程序中。我有一个TransformBlock<object, object>
和一个ActionBlock<object>
,我将它们链接起来:
transformBlock.LinkTo(notificationBlock);
ActionBlock<object>
应该使用当前进度更新我的视图中的进度条,但是界面似乎被冻结了,只有在所有处理完成后才会更新。
我的CurrentProgress
属性如下所示:
private double _CurrentProgress;
public double CurrentProgress
{
get { return _CurrentProgress; }
set
{
_CurrentProgress = value;
RaisePropertyChanged("CurrentProgress");
}
}
我正在将它绑定到我的视图上,如下所示:
<ProgressBar Value="{Binding CurrentProgress, Mode=OneWay}" Name="uxProgressBar"/>
我有一个问题,为什么TPL会阻塞UI线程?
编辑
这是我实例化TPL的方式:
foreach(var myObj in ObjList)
{
transformBlock.Post(myObj);
}
转换块:
TransformBlock<object, object>(
temp =>
{
var response = ProcessRecord(temp);
return response.Status;
},
new ExecutionDataflowBlockOptions
{
MaxDegreeOfParallelism =20
});
操作块:
ActionBlock<object>(
temp =>
{
CurrentProgress = (double)temp.RecordNumber/(double)TotalRecords;
},
new ExecutionDataflowBlockOptions
{
TaskScheduler = TaskScheduler.FromCurrentSynchronizationContext()
});
更新
TransformBlock
中调用的 Web 服务是一个遗留的(asmx)Web 服务,它没有被异步调用。修复了这个问题后,一切都可以正常工作,而不需要使用 Dispatcher
或其他建议的解决方案。
从问题的评论中可以看出,WPF 支持从另一个线程向 UI 线程发布。但我还没有找到任何官方文档关于此的说明。
TPL
的? - 123 456 789 0System.Windows.Data
错误。 - Eli Arbel