gpt4 book ai didi

c# - WPF MVVM 和 TPL 数据流中的进度条

转载 作者:太空狗 更新时间:2023-10-29 23:22:52 24 4
gpt4 key购买 nike

我在遵循 MVVM 模式的 WPF 应用程序中使用 TPL 数据流。我有一个 TransformBlock<object,object>和一个 ActionBlock<object>我像这样链接它们:

transformBlock.LinkTo(notificationBlock);

ActionBlock<object>应使用当前进度更新我 View 中的进度条,但 UI 似乎已卡住,并且仅在所有处理完成时更新。

我的 CurrentProgress属性看起来像这样:

private double _CurrentProgress;

public double CurrentProgress
{
get { return _CurrentProgress; }
set
{
_CurrentProgress = value;
RaisePropertyChanged("CurrentProgress");
}
}

然后我像这样将它绑定(bind)到我的 View :

<ProgressBar Value="{Binding CurrentProgress, Mode=OneWay}" Name="uxProgressBar"/>

我错过了什么吗?为什么 TPL 会阻塞 UI 线程?

编辑

这就是我实例化 TPL 的方式:

foreach(var myObj in ObjList)
{
transformBlock.Post(myObj);
}

变换 block :

TransformBlock<object, object>(
temp =>
{
var response = ProcessRecord(temp);
return response.Status;
},
new ExecutionDataflowBlockOptions
{
MaxDegreeOfParallelism =20
});

Action block :

ActionBlock<object>(
temp =>
{
CurrentProgress = (double)temp.RecordNumber/(double)TotalRecords;
},
new ExecutionDataflowBlockOptions
{
TaskScheduler = TaskScheduler.FromCurrentSynchronizationContext()
});

更新

TransformBlock 中调用的 Web 服务是遗留 (asmx) 网络服务,它没有被称为 Async .解决此问题后,无需使用 Dispatcher 即可正常工作或任何其他建议的解决方案。

从对问题的评论之一来看,WPF 似乎确实支持从另一个线程发布到 UI 线程。不过,我还没有找到任何关于此的官方文档。

最佳答案

首先,您的 ActionBlock 不必直接更改 CurrentProgress 属性。

原因是 RaisePropertyChanged 函数将直接运行 ProgressBar 对象的代码。这是不允许的,因为它是 UIThread 拥有的对象。

ActionBlock 在他自己的线程中运行,他需要将 progressBar 更新命令发布到 UI 线程(通过使用 Dispatcher.BeginInvoke):

ActionBlock<object>(
temp =>
{
double progress = (double)temp.RecordNumber/(double)TotalRecords;
Dispatcher.BeginInvoke((Action)(() =>
{
CurrentProgress = progress;
}));
},
new ExecutionDataflowBlockOptions
{
TaskScheduler = TaskScheduler.FromCurrentSynchronizationContext()
});

为了做出你想要的东西,你必须首先改变这件事。

其次(如果这没有改变任何东西),您必须检查您的 UI 线程是否正在等待您的 TransformBlock 完成。如果您的 ICommand(例如,如果您从按钮调用它)不是 ASync 并执行如下操作:

transformBlock.Completion.Wait();

这不对。因为你的 UIThread 会等待你的处理结束,直到结束才会接受之前的 progressBar 更新命令。

祝你好运!如果它始终不起作用,请发布新的详细信息。

关于c# - WPF MVVM 和 TPL 数据流中的进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22971232/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com