当前位置: 首页 > 编程语言 > C#

如何从后台线程正确更新数据绑定数据网格视图分享

时间:2023-04-10 19:16:10 C#

如何从后台线程正确更新数据绑定数据网格视图我有这些对象的集合,其中集合基于BindingList我已经为集合创建了一个绑定源,并设置了datagridview的绑定源和数据源。一切都很好,只是我需要从后台线程更新自定义对象的属性。当我这样做时,出现以下错误:BindingSource不能是它自己的数据源。不要将DataSource和DataMember属性设置为引用BindingSource的值我发现以下帖子似乎有我的确切问题(和解决方案?)但我无法弄清楚。http://social.msdn.microsoft.com/forums/en-US/winformsdatacontrols/thread/3566f7c7-eb47-422e-ab09-9549a18da360/我为业务对象中的每个帖子创建并初始化了op变量,然后将这两个事件函数放入我的集合类中。这编译正确,但在运行时无一例外地挂起。我看到很多帖子说使用Invoke/BeginInvoke,但是我并没有在UI上调用任何函数,只是更新业务对象,所以我不确定在哪里调用invoke。一个限制:我希望业务对象不知道谁在显示它(因为有多个消费者),因此将GUI引用发送到业务对象以便我稍后可以使用这些引用调用invoke不是一种选择。我在一个有效的论坛中找到了这门课。只需使用它而不是使用System的BindingList;使用System.Collections.Generic;使用System.Linq;使用系统文本;使用System.ComponentModel;使用系统线程;namespaceUtility{publicclassThreadedBindingList:BindingList{SynchronizationContextctx=SynchronizationContext.Current;protectedoverridevoidOnAddingNew(AddingNewEventArgse){if(ctx==null){BaseAddingNew(e);}else{ctx.Send(delegate{BaseAddingNew(e);},null);}}voidBaseAddingNew(AddingNewEventArgse){base.OnAddingNew(e);}protectedoverridevoidOnListChanged(ListChangedEventArgse){//SynchronizationContextctx=SynchronizationContext.Current;如果(ctx==null){BaseListChanged(e);}else{ctx.Send(delegate{BaseListChanged(e);},null);}}voidBaseListChanged(ListChangedEventArgse){base.OnListChanged(e);}}}因为我花时间根据我的需要格式化示例,所以我可以使它具有可读性。参考发布在这里。除了格式化,什么都没有改变。使用System.ComponentModel;使用系统线程;namespaceUtility{publicclassThreadedBindingList:BindingList{SynchronizationContextctx=SynchronizationContext.Current;protectedoverridevoidOnAddingNew(AddingNewEventArgse){if(ctx==null){BaseAddingNew(e);}else{ctx.Send(delegate{BaseAddingNew(e);},null);}}voidBaseAddingNew(AddingNewEventArgse){base.OnAddingNew(e);}protectedoverridevoidOnListChanged(ListChangedEventArgse){//SynchronizationContextctx=SynchronizationContext。当前的;如果(ctx==null){BaseListChanged(e);}else{ctx.Send(delegate{BaseListChanged(e);},null);}}voidBaseListChanged(ListChangedEventArgse){base.OnListChanged(e);不完全是线程安全的,但如果你的后台线程修改对象属性的速度比它们出现的速度快,那么对上述答案的这个小改动可能会产生很大的不同。protectedoverridevoidOnListChanged(ListChangedEventArgse){//SynchronizationContextctx=SynchronizationContext.Current;如果(ctx==null){BaseListChanged(e);}elseif(e.ListChangedType==ListChangedType.ItemChanged){ctx.Post(delegate{BaseListChanged(e);},null);}else{ctx.Send(delegate{BaseListChanged(e);},null);如果同一个对象被多次修改,任何减少发布调用数量的建议都是受欢迎的,并确保任何后续的发送调用将被阻塞,直到所有发布的调用都被处理。以上就是C#学习教程:如何从后台线程正确更新数据绑定数据网格视图分享的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收藏,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: