【问题标题】:Invalid Operation Exception - "Cross-thread operation not valid: Control 'TextBox1' accessed from a thread other than the thread it was created on."无效操作异常-“跨线程操作无效:控件'TextBox1'从创建它的线程以外的线程访问。”
【发布时间】:2010-03-08 16:04:59
【问题描述】:

“如果需要是 发明,我想杀了那家伙 这是谁发明的。”

-吉米巴菲特

我不在乎 100 个拥有一百万声望的人会不会因为这样说而跳到我的喉咙里,但谁曾想过抛出这个异常,就该遭受比死亡更糟糕的命运。

我已经QUITE LITERALLY将代码从一个项目复制并粘贴到另一个项目,以将标准数据填充到一小组文本框中。在一个应用程序中,数据完美显示。我现在正在开发的新版本当然会抛出这个异常。

所以这是我的问题 - 如果代码相同,为什么一个会抛出它而另一个不会?项目设置中有设置吗?文本框中是否有阻止这种情况的属性?

我不记得在项目中设置任何内容来忽略此异常,但代码完全相同

【问题讨论】:

  • 你需要展示一些代码。
  • 您将其粘贴到非 UI 线程中。
  • 可能应该先了解线程和异步编程,然后再上马并宣布一些愚蠢的事情。
  • 为什么不在脱口而出侮辱之前先了解一下你在和谁说话?我只是不觉得创建一个委托,检查是否需要调用,调用一个多参数委托,然后查看结果是有效替代 lock(mylock){string1=string2;} 的有效方法。跨度>

标签: c# .net winforms exception


【解决方案1】:

在创建控件的线程上设置了STAThread属性?

填充代码是否在 UI 线程中调用?没人关心你是否正确地复制了代码——如果调用是在错误的线程上开始的。

【讨论】:

  • 嗯,它不必设置。它应该在 Main 方法上,否则将任何其他线程的公寓设置为 STA:thread.SetApartmentState(ApartmentState.STA);
【解决方案2】:

我不想重复错误消息,但您正试图从与创建控件的线程不同的线程修改控件。

看看InvokeRequiredInvoke

【讨论】:

    猜你喜欢
    • 2011-01-15
    • 2016-05-21
    • 2016-06-11
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多