当前位置:  开发笔记 > 编程语言 > 正文

奇怪的跨线程UI错误

如何解决《奇怪的跨线程UI错误》经验,为你挑选了0个好方法。

我正在编写一个WinForms应用程序,它有两种模式:控制台或GUI.同一解决方案中的三个项目,一个用于控制台应用程序,一个用于UI表单,第三个用于保存两个接口都将连接的逻辑.控制台应用程序运行绝对顺利.

一个包含用户选择的模型,它有一个IListT是一个本地对象Step,它实现了INotifyPropertyChanged,因此在UI中它被安装到DataGridView上.一切都在运行时很好,对象的初始状态反映在屏幕上.

每个Step对象是依次执行的任务; 一些属性将改变,反映回IList并传递给DataGridView.

UI版本中的此操作是通过创建BackgroundWorker将事件提升回UI来完成的.这样Step做并生成一个StepResult对象,它是一个表示结果的枚举类型(例如Running,NotRun,OK,NotOK,Caveat)和一个表示消息的字符串(因为步骤已经运行但不完全符合预期,即有一个警告).通常,操作将涉及数据库交互,但在调试模式下,我随机生成结果.

如果消息为null,则永远不会有问题,但是如果我生成这样的响应:

StepResult returnvalue = new StepResult(stat, "completed with caveat")

我收到一个错误,说明正在从创建它的线程以外的线程访问DataGridView.(我通过一个自定义处理程序传递它,它应该在需要时处理调用 - 也许它不会?)

然后,如果我生成一个唯一的响应,例如使用随机数r:

StepResult returnvalue = new StepResult(stat, r.ToString());

操作成功没有问题,数字写得干净利落地写入DataGridView.

我很困惑.我假设它在某种程度上是一个字符串文字问题,但任何人都可以提出更明确的解释吗?

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有