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

C# WinForms中执行异步数据导入的数据绑定,c#,winforms,multithreading,data-binding,C#,Winforms,Multithreading,Data Binding,我有一个场景,其中有一个对象集合绑定到winforms中的datagrid。如果用户将一个项目拖放到网格中,我需要在网格中添加一个占位符行,并启动一个漫长的异步导入过程。我需要将异步导入过程的状态传回UI,更新网格中的行,并让UI保持响应,以允许用户编辑其他行 这样做的最佳实践是什么 我目前的解决方案是:将a绑定到网格,填充网格中显示为行的对象。当用户将一个项目拖放到网格中时,我创建一个新对象,其中包含从拖放的项目中获得的稀疏信息,并将其添加到BindingList中,从而禁用对该行的编辑。然后

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

这样做的最佳实践是什么

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

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

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


谢谢

听起来像是报告进度的后台工作人员将帮助您完成导入操作和ui报告。
您应该在msdn上阅读有关此后台工作人员类的内容,我认为BackgroundWorker将帮助您完成此任务(您还可以使用单独的线程,并在UI线程上使用正确的invoke()调用)。问题是所有单独的线程都在更新UI。您知道,UI的所有更新都需要在UI所属的同一线程上,因此,使用锁创建BindingList的安全实现,并执行大量更新,可能会导致表单无响应。 如果您使用BackgroundWorker尝试限制ReportProgress的使用,如果表单滞后,则改进功能的更安全的方法是使用2 datagrid。您可以将它们一个接一个地处理,就像它只是一个网格一样


再见

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

好的

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

  • 用户将项目拖放到网格中
  • 异步进程已启动
  • 更新用户界面以显示“处理”
  • 回调处理程序获取异步进程的响应
  • 异步回调更新绑定源
  • 异步回调调用网格上的“databind”来刷新视图以包含新数据
  • 我会使用线程而不是后台工作人员,但我很有信心使用线程

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


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

    如果不了解BindingList中包含的对象的性质,很难判断。它们本身也是线程安全的吗?如果是,代价是什么?它们只是一组普通字段,还是涉及一些复杂的数据结构,如列表和树?在前一种情况下,您可以保持原样:这是“一个作者,一个读者”的情况,应该是线程安全的。在后一种情况下,这取决于如何确保线程安全:它可能会产生显著的性能损失。无论如何,请多告诉我一些关于这些物体的情况,这样会更容易说出来。