WinForms中的数据绑定执行异步数据导入

我有一个场景,我有一个绑定到winform中的数据网格的对象的集合。 如果用户将一个项目拖放到网格上,我需要在网格中添加一个占位符行,并启动冗长的异步导入过程。 我需要将异步导入过程的状态反馈回UI,更新网格中的行,并让UI保持响应以允许用户编辑其他行。

这样做的最佳做法是什么?

我目前的解决方案是:将BindingList的线程安全实现绑定到网格,并填充在网格中显示为行的对象。 当用户将一个项目拖放到网格上时,我创建了一个新对象,其中包含从已删除项目获取的稀疏信息,并将其添加到BindingList,禁用该行的编辑。 然后我引发一个单独的线程来执行导入操作,将刚刚创建的新绑定对象传递给它以填充数据。 导入过程定期设置对象的状态并触发UI订阅的事件,告诉它刷新网格以查看对象上的新属性。

我是否应该将绑定到网格的同一对象传递给导入进程线程进行操作,还是应该使用BeginInvoke创建副本并将更改合并回UI线程上的对象?

有关此实施的任何问题或建议?

谢谢


好 ...

我看到事件的流动是这样的:

  • 用户将物品拖放到网格
  • 异步过程被启动
  • 用户界面被更新以显示“处理”
  • 回调处理程序获取异步进程的响应
  • 异步回调更新绑定源
  • 异步回调调用网格上的“数据绑定”以刷新视图以包含新数据。
  • 我会使用一个线程而不是后台工作者,但我非常有信心使用线程。

    后台工作人员确实简化了线程,如果您不信任,这将是我推荐的起点。

    这样你就可以将源代码和用户界面一起更新,用户可以在处理过程中继续使用应用程序。


    这听起来像一个报告进度背景的工作人员会帮助你做你的进口操作和用户报告。 你应该阅读关于MSDN上的这个Background worker类


    我认为BackgroundWorker会帮助你完成这个任务(你也可以在UI线程上使用正确的invoke()调用来使用单独的线程)。 问题是由所有单独的线程完成UI的更新。 您知道,UI的所有更新都需要在UI出现的同一线程上,因此,使用锁创建BindingList的安全实现并进行大量更新可能会导致表单无响应。 如果您使用BackgroundWorker尝试限制ReportProgress的使用,如果表单滞后于改进功能的更安全的方法是使用2个数据网格。 你可以将它们放置一个,就像它只是一个网格。

    再见

    链接地址: http://www.djcxy.com/p/71113.html

    上一篇: Databinding in WinForms performing async data import

    下一篇: How to set SQL condition precedence for two different conditions