我正在设计/重新编写一个应用程序的数据绑定部分,这些部分大量使用 winforms数据绑定和更新来自后台线程(在> 100个记录上一次).
假设应用程序是股票交易应用程序,后台线程监视数据更改并将其放在数据对象上.这些对象存储在绑定列表<>并实现INotifyPropertyChanged通过数据绑定将更改传播到winforms控件.
此外,数据对象当前正在通过 WinformsSynchronizationContext.Send将更改编组到UI线程.
用户能够在UI中输入一些值,这意味着可以从两面更改一些值.用户值不应该被更新覆盖.

所以我想到了几个问题:

>有没有一般的设计公民如何做(数据绑定的后台更新)?
>什么时候和如何组织UI线程?
>背景线程的最佳交互方式是什么?
绑定/数据对象?
>应该使用哪些类/接口? (BindingSource,…)
> …

我正在搜索这种情景的一般建议/设计指南…

我感谢所有的想法,链接,…

TIA
马丁

thx的想法到目前为止,但我知道Control.Invoke / BeginInvoke,…我更好地在最佳实践.作为一个附加信息,UI并不知道有一个后台线程,更新控件,并且根据我在数据绑定场景中的理解,UI不应该知道数据来自哪里…你可以认为的背景线程作为将数据推送到UI的东西,所以我不知道backgroundworker是否是我正在搜索的选项.

编辑:
另一个问题来到我的脑海:
您希望在数据/业务对象中的操作期间获得一些UI响应(例如,在重新计算期间设置背景).在绑定到背景的状态属性上增加一个propertychanged是不够的,因为在计算结束后控件被重新绘制是不够的?我的想法是钩住propertychanged事件并调用.update()在控件上…
有什么其他想法吗?

解决方法

这是一个困难的问题,因为大多数“解决方案”导致大量的自定义代码和大量的调用BeginInvoke()或System.ComponentModel.BackgroundWorker(它本身只是一个薄的封装在BeginInvoke上).

过去,我也发现您很快希望延迟发送INotifyPropertyChanged事件,直到数据稳定.处理一个改变事件的代码通常需要阅读其他特性.当许多属性之一的状态发生变化时,您也经常有一个需要重新绘制的控件,而且您也不需要太多频繁地重新绘制控件.

首先,每个自定义WinForms控件都应该读取所​​有需要在PropertyChanged事件处理程序中绘制的数据,因此当它是一个WM_PAINT(OnPaint)消息时,它不需要锁定任何数据对象.控制器在获取新数据时不应立即重绘;而应该调用Control.Invalidate(). Windows会将WM_PAINT消息组合到尽可能少的请求中,并且只有当UI线程没有其他任何事情时才发送它们.这样可以最大限度地减少重绘次数和数据对象被锁定的时间. (标准控件大多是通过数据绑定来实现的)

数据对象需要记录改变的内容,然后一旦完成了一组更改,“踢”UI线程调用SendChangeEvents方法,然后调用PropertyChanged事件处理程序(在UI线程上)所有属性已更改. SendChangeEvents()方法正在运行时,必须锁定数据对象以阻止后台线程进行更新.

每当一组更新从数据库读取bean时,UI线程可以通过对BeginInvoke的调用“踢”.通常最好使用定时器进行UI线程轮询,因为Windows在UI消息队列为空时才发送WM_TIMER消息,因此导致UI感觉更加敏感.

还要考虑到根本不使用数据绑定,并且每当定时器触发时,UI都要求每个数据对象“发生什么变化”.数据绑定总是看起来不错,但可以很快成为问题的一部分,而不是部分解决方案.

因为数据对象的锁定/解锁是一种痛苦,并且可能不允许从数据库中读取更新的速度足够快,您可能希望将UI线程传递给数据对象的(虚拟)副本.使数据对象持久/不可变,以便对数据对象的任何更改返回一个新的数据对象,而不是更改当前数据对象可以启用此功能.

持久的对象听起来很慢,但不一定要看一些指针this和that.另请参阅堆栈溢出上的this和that.

还可以看看retlang – Message-based concurrency in .NET.它的消息批处理可能很有用.

(对于WPF,我将有一个View-Model,它设置在UI线程中,然后通过后台线程从多线程模型的“批处理”中更新,然而WPF在组合数据绑定事件WinForms .)

WinForms多线程数据绑定场景,最佳做法?的更多相关文章

  1. iOS:用于填充异步提取数据的设计模式

    我正在开发一个从Web获取数据并将其显示给用户的应用程序.假设数据是餐馆的评论,并且在一个视图上显示一个评论.用户可以向左或向右滑动以转到上一个/下一个评论.数据是异步提取的.这是问题陈述–假设已经提取了5条评论,并且用户正在查看当前的第3条评论.现在,第6次审核被提取,我想将其显示为用户的第4次审核.我的模型类应该如何通知视图控制器?除上述3之外的其他建议值得欢迎!

  2. iOS:核心图像和多线程应用程序

    我试图以最有效的方式运行一些核心图像过滤器.试图避免内存警告和崩溃,这是我在渲染大图像时得到的.我正在看Apple的核心图像编程指南.关于多线程,它说:“每个线程必须创建自己的CIFilter对象.否则,你的应用程序可能会出现意外行为.”这是什么意思?我实际上是试图在后台线程上运行我的过滤器,所以我可以在主线程上运行HUD(见下文).这在coreImage的上下文中是否有意义?

  3. ios – 多个NSPersistentStoreCoordinator实例可以连接到同一个底层SQLite持久性存储吗?

    我读过的关于在多个线程上使用CoreData的所有内容都讨论了使用共享单个NSPersistentStoreCoordinator的多个NSManagedobjectContext实例.这是理解的,我已经使它在一个应用程序中工作,该应用程序在主线程上使用CoreData来支持UI,并且具有可能需要一段时间才能运行的后台获取操作.问题是NSPersistentStoreCoordinator会对基础

  4. ios – XCode断点应该只挂起当前线程

    我需要调试多线程错误.因此,为了获得生成崩溃的条件,我需要在代码中的特定点停止一个线程,并等待另一个线程到达第二个断点.我现在遇到的问题是,如果一个线程遇到断点,则所有其他线程都被挂起.有没有办法只停止一个线程,让其他线程运行,直到它们到达第二个断点?)其他更有趣的选择:当你点击第一个断点时,你可以进入控制台并写入这应该在该断点处暂停当前上下文中的线程一小时.然后在Xcode中恢复执行.

  5. ios – 1天后firebase crashlytics报告中没有数据

    解决方法对于那些仍然有问题的人.检查您的podfile中是否还有pod’Firebase/Crash’.当我删除旧的Firebase崩溃报告时,我的问题已修复.

  6. ios – 在后台线程中写入Realm后,主线程看不到更新的数据

    >清除数据库.>进行API调用以获取新数据.>将从API检索到的数据写入后台线程中的数据库中.>从主线程上的数据库中读取数据并渲染UI.在步骤4中,数据应该是最新数据,但我们没有看到任何数据.解决方法具有runloops的线程上的Realm实例,例如主线程,updatetothelatestversionofthedataintheRealmfile,因为通知被发布到其线程的runloop.在后台

  7. 将AWS DynamoDB表中的数据加载到iOS上的UITableView

    我的iOS应用程序中使用Swift编写的一个屏幕是UITableView.在这个UITableView中,我想从AWSDynamoDB表中加载名为Books的数据.目前,这是我在故事板上的原型单元格:在表格中我有3个属性:“名称”,“价格”和“ISBN”.我想要的是扫描“书籍”表,并过滤结果,因此结果的“ISBN”属性将包含数字“9”.在我筛选结果后,我想将它们应用到UITableView,因此“

  8. ios – 未为测试目标生成核心数据类

    我使用CoreData的自动生成的类.除测试目标外,我的项目还有3个目标.对于每个目标,正确生成CoreData类,我通过检查DerivedData文件夹进行验证.但是,尽管在核心数据模型文件中打勾,但不会为测试目标生成类.当我尝试引用测试目标中的一个CoreData类时,这会导致“未声明的标识符”和“使用未声明的类型”错误.我该如何解决这个问题?

  9. ios – NSURLCache和数据保护

    我正在尝试保护存储在NSURLCache中的敏感数据.我的应用程序文件和CoreDatasqlite文件设置为NSFileProtectionComplete.但是,我无法将NSURLCache文件数据保护级别更改为NSFileProtectionCompleteUntilFirstUserAuthentication以外的任何其他级别.这会在设备锁定时暴露缓存中的任何敏感数据.我需要缓存响应,以

  10. ios – 领域:如何获取数据库的当前大小

    是否有RealmAPI方法使用RealmSwift作为数据存储来获取我的RealmSwift应用程序的当前数据库大小?

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部