Uns*_*ced 6 c# string multithreading literals
我正在编写一个WinForms应用程序,它有两种模式:控制台或GUI.同一解决方案中的三个项目,一个用于控制台应用程序,一个用于UI表单,第三个用于保存两个接口都将连接的逻辑.控制台应用程序运行绝对顺利.
一个包含用户选择的模型,它有一个IList<T>T是一个本地对象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")
Run Code Online (Sandbox Code Playgroud)
我收到一个错误,说明正在从创建它的线程以外的线程访问DataGridView.(我通过一个自定义处理程序传递它,它应该在需要时处理调用 - 也许它不会?)
然后,如果我生成一个唯一的响应,例如使用随机数r:
StepResult returnvalue = new StepResult(stat, r.ToString());
Run Code Online (Sandbox Code Playgroud)
操作成功没有问题,数字写得干净利落地写入DataGridView.
我很困惑.我假设它在某种程度上是一个字符串文字问题,但任何人都可以提出更明确的解释吗?
由于您是通过事件订阅进行 UI 绑定,因此您可能会发现这很有帮助;这是我不久前写的一个示例,展示了如何进行子类化BindingList<T>,以便将通知自动编组到 UI 线程。
如果没有同步上下文(即控制台模式),则它将恢复为简单的直接调用,因此没有开销。在 UI 线程中运行时,请注意,这本质上使用Control.Invoke,它本身只是直接运行委托(如果它位于 UI 线程上)。因此,如果从非 UI 线程编辑数据,则只有任何切换 - 这正是我们想要的;-p
| 归档时间: |
|
| 查看次数: |
2172 次 |
| 最近记录: |