代码之家  ›  专栏  ›  技术社区  ›  burnside

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

  •  5
  • burnside  · 技术社区  · 16 年前

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

    这样做的最佳实践是什么?

    我目前的解决方案是:绑定 thread safe implementation of BindingList 到栅格,填充栅格中显示为行的对象。当用户将一个项目拖放到网格中时,我创建一个新对象,其中包含从拖放的项目中获得的稀疏信息,并将其添加到BindingList中,从而禁用对该行的编辑。然后,我启动一个单独的线程来进行导入,将刚刚创建的用于填充数据的新绑定对象传递给它。导入过程会定期设置对象的状态,并触发一个事件,该事件由UI订阅,告诉它刷新网格以查看对象上的新属性。

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

    这个实现有什么问题或建议吗?

    4 回复  |  直到 9 年前
        1
  •  1
  •   War    16 年前

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

    1. 用户将项目拖放到网格中
    2. 更新用户界面以显示“处理”
    3. 回调处理程序获取异步进程的响应

    我会使用线程而不是后台工作人员,但我很有信心使用线程。

    后台工作人员确实简化了线程,如果您没有信心,那将是我建议的起点。

    这样,您可以同时更新源和ui,用户可以在处理过程中继续使用应用程序。

        2
  •  0
  •   Chen Kinnrot    16 年前

    听起来,报告进度后台工作人员将帮助您完成导入操作和ui报告。

        3
  •  0
  •   Guaido79    16 年前

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

    拜伊

        4
  •  0
  •   labadana    16 年前

    我认为最好在UI线程上创建一个副本并合并回对对象的更改,因为另一种方法-使用原始引用将要求您对对象和绑定列表进行更多锁定。

    推荐文章