- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在遵循 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/
是否可以插入到初始表,然后使用插入的 ID 插入到主表中,该主表在一个数据流的列之间具有外键约束? 我是集成服务的新手,不知道这些功能 场景: 表 A - ID - DESC 表 B - ID - A
在 Azure 数据流中,在聚合转换中是否可以在分组依据中动态包含列?我在分组依据中可能需要 8 列,具体取决于它们的值,即如果值为 1,则包含在分组依据中。 简化为 2 列: Column1
我想要实现的是在azure数据流中包含错误处理,如果在传输行时发生错误,它不应该失败,它会处理其他行并将发生错误的行的ID保存在文本文件或日志中 示例: 假设我们有 10 行要沉入表中,不知何故我们在
我的数据流作业将源和接收器作为突触数据库。 我在从突触数据库提取数据时有一个源查询,其中包含数据流中的联接和转换。 众所周知,底层的数据流将启动 databricks 集群来执行数据流代码。 我的问题
这是关于非常常见的传感器数据处理问题。 为了同步和合并来自不同来源的传感器数据,我想用 Java 实现它,而不需要太复杂的第三个库或框架。 假设我定义了一个对象 (O),它由 4 个属性 (A1,..
我开始从事一个项目,我需要使用 PowerTrack/GNIP 流式传输 Twitter 数据,老实说,我在网络方面非常非常缺乏经验,而且我完全不了解网络方面的知识到数据流 (HTTP),它们如何工作
我有一个后端要用 Python 实现,它应该将数据流式传输到 JavaScript 正在创建表示的 Web 浏览器(例如,不断更新变量或绘制到 )。 该数据将以高达 100 Hz 的速率更新(最坏情
我构建了一个简单的 MERN 应用程序,用户可以在其中对电话号码进行评分。用户只需填写电话号码,选择评级(1 - 5 星评级)、城市和短文本。该应用程序具有带过滤和排序选项的搜索功能。这一切都足够好
我在 TPL 数据流上使用顺序管道构建,它由 3 个块组成: B1 - 准备消息 B2 - 将消息发布到远程服务 B3 - 保存结果 问题是如何在发生服务关闭等错误时关闭管道。管道必须以受控方式关闭,
我在 ADF 数据流中有一个数据集(ADLS Gen2 中存在的 csv 文件)。我第一次尝试进行数据预览时,原始文件中的所有列都正确显示。然后,我从 csv 文件中删除了第一列并刷新了“数据预览”选
我正在使用 ADF v2 DataFlow ativity 将数据从 Blob 存储中的 csv 文件加载到 Azure SQL 数据库中的表中。在数据流(源 - Blob 存储)中,在源选项中,有一
我有很多带有嵌套列表的 json 文件需要展平。问题是它们是不同的,我不想为它们每一个创建一个分支。如何通过输入参数动态执行具有“展开依据”和“输入列”字段的展平事件? 谢谢! 最佳答案 对于展开方式
我一直在尝试使用 Azure 数据工厂的数据流在文件的小数列中进行数据类型检查,但它没有按预期工作。我的问题如下: 我想检查数字 121012132.12 是否为小数,因此我使用数据流的派生列并编写表
我们使用 Azure 数据流在 Azure SQL 数据仓库中生成数据表的历史记录。在数据流中,我们在所有列上使用 md5 或 sha1 函数来生成唯一的行指纹来检测记录中的更改,或识别已删除/新记录
我们使用 Azure 数据流在 Azure SQL 数据仓库中生成数据表的历史记录。在数据流中,我们在所有列上使用 md5 或 sha1 函数来生成唯一的行指纹来检测记录中的更改,或识别已删除/新记录
我之前使用 bz2 来尝试解压缩输入。我想要解码的输入已经是压缩格式,因此我决定将格式输入到交互式 Python 控制台中: >>> import bz2 >>> bz2.decompress(inp
在测试 WPF 项目中,我尝试使用 TPL 数据流来枚举给定父目录的所有子目录,并创建具有特定文件扩展名的文件列表,例如“.xlsx”。我使用 2 个 block ,第一个 dirToFilesBlo
问题:为什么使用 WriteOnceBlock (或 BufferBlock )用于从另一个 BufferBlock 取回答案(类似回调) (取回答案发生在发布的 Action 中)导致死锁(在此代码
此代码永远不会到达最后一行,因为完成不会从 saveBlock 传播到 sendBlock。我做错了什么? var readGenerateBlock = new TransformBlock(n =
好吧,我知道我的问题需要更多的指导,而不是技术细节,但我希望 SO 成员不会介意 TPL 数据流的新手提出一些非常基础的问题。 我有一个简单的 Windows 窗体应用程序,它负责从我系统上的 Exc
我是一名优秀的程序员,十分优秀!