我正在编写一个 WinForms 应用程序,它有两种模式:控制台或 GUI。同一解决方案中的三个项目,一个用于控制台应用程序,一个用于 UI 表单,第三个用于保存两个界面也将连接的逻辑。控制台应用程序运行绝对流畅。
一个保存用户选择的模型,它有一个IList<T>
where T 是一个本地对象,Step
它实现INotifyPropertyChanged
了 ,所以在 UI 中它被挂载到一个 DataGridView 上。运行时一切正常,对象的初始状态反映在屏幕上。
每个Step
对象都是一个任务,依次执行;一些属性会改变,被反射回 IList 并传递给 DataGridView。
UI 版本中的此操作是通过创建 BackgroundWorker 将事件返回给 UI 来完成的。执行此Step
操作并生成一个StepResult
对象,该对象是一个指示结果(例如 Running、NotRun、OK、NotOK、Caveat)的枚举类型和一个指示消息的字符串(因为该步骤已运行但不完全符合预期,即带有警告)。通常,这些操作将涉及数据库交互,但在调试模式下,我会随机生成一个结果。
如果消息为空,则永远不会有问题,但是如果我生成这样的响应:
StepResult returnvalue = new StepResult(stat, "completed with caveat")
我收到一条错误消息,指出 DataGridView 是从创建它的线程以外的线程访问的。(我通过一个自定义处理程序传递它,该处理程序应该在需要时处理调用 - 也许它没有?)
然后,如果我生成一个独特的响应,例如使用随机数r
:
StepResult returnvalue = new StepResult(stat, r.ToString());
操作成功,没有问题,数字被干净地写入 DataGridView。
我很困惑。我假设它在某种程度上是一个字符串文字问题,但任何人都可以提出更清晰的解释吗?