gpt4 book ai didi

c# - 奇怪的跨线程 UI 错误

转载 作者:太空狗 更新时间:2023-10-29 21:31:49 26 4
gpt4 key购买 nike

我正在编写一个具有两种模式的 WinForms 应用程序:控制台或 GUI。同一解决方案中的三个项目,一个用于控制台应用程序,一个用于 UI 表单,第三个用于保存两个界面也将连接的逻辑。控制台应用程序运行绝对流畅。

一个保存用户选择的模型,它有一个 IList<T>其中 T 是本地对象,Step , 它实现了 INotifyPropertyChanged ,因此在 UI 中,它被安装到 DataGridView 上。运行时一切正常,对象的初始状态反射(reflect)在屏幕上。

每个 Step对象是轮流执行的任务;一些属性会发生变化,反射(reflect)回 IList 并传递给 DataGridView。

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

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

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

我收到一条错误消息,指出正在从创建它的线程以外的线程访问 DataGridView。 (我通过一个自定义处理程序传递它,该处理程序应该在需要时处理调用——也许不需要?)

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

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

操作成功没有问题,数字被干净地写入 DataGridView。

我很困惑。我假设这是一个字符串文字问题,但任何人都可以提出更清晰的解释吗?

最佳答案

你已经回答了你自己的问题:-

I get an error saying that the DataGridView was being accessed from a thread other than the thread it was created on.

WinForms 坚持对表单和控件执行的所有操作都在创建表单的线程的上下文中完成。原因很复杂,但与底层 Win32 API 有很大关系。有关详细信息,请参阅 The Old New Thing 上的各种条目博客。

您需要做的是使用 InvokeRequired 和 Invoke 方法来确保始终从同一线程访问控件(伪代码):

object Form.SomeFunction (args)
{
if (InvokeRequired)
{
return Invoke (new delegate (Form.Somefunction), args);
}
else
{
return result_of_some_action;
}
}

关于c# - 奇怪的跨线程 UI 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/200314/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com