【问题标题】:System.InvalidOperationException: 'Cross-thread operation not valid: Control 'label2' accessed from a thread other than the thread it was created on.' [duplicate]System.InvalidOperationException:'跨线程操作无效:控件'label2'从创建它的线程以外的线程访问。 [复制]
【发布时间】:2018-09-01 19:44:50
【问题描述】:

我目前正在尝试创建一个单独的线程来显示服务器消息,但我得到一个错误,说我为标签 2 使用了错误的线程。

我的代码是这样的

Thread MOTD = new Thread(() =>
    {
        System.Net.WebClient wc = new System.Net.WebClient();
        // Use webclient to download webpage from target URL
        byte[] raw = wc.DownloadData("https://targaryentech.com/Backend/test.txt");
        // Convert to string
        string webData = System.Text.Encoding.UTF8.GetString(raw);
        // String to MessageBox
        label2.Text = webData;
     });
MOTD.Start();

【问题讨论】:

  • 标签 2 很可能在“主线程”上创建并放置在那里,您应该考虑调用控件
  • @Karky - 您可以查看我列出的重复问题。它向您展示了如何做到这一点。您需要在主线程中执行标签更新。你通过调用来做到这一点。副本中有示例,还有一个答案很好地解释了 UI 线程模型。
  • @Karky - 顺便说一句,WebClient 实现了IDisposable,所以当你完成它时你应该调用Dispose。一种简单的方法是将其包装在 using 语句中。

标签: c# multithreading


【解决方案1】:

UI 标签(我认为 label2 是)只能从主线程修改。

【讨论】:

  • 我想做的是让标签更改文本2秒钟然后消失,但我不想冻结主线程,因为上面有很多重要的东西
  • 好的,我明白了。 Ui 控件(如标签)可以从创建它的线程中修改。
  • @random - 虽然这在某种意义上回答了“为什么会发生这种情况?”的问题。它没有显示如何解决问题。
  • @pstrjds 对于我应该如何做这件事你有什么解决方法吗?顺便说一句:添加了 Dispose() 类型
  • @Karky - 没有纯粹意义上的“解决方法”,因为这不是错误或缺点,它只是实现的本质。解决方案是调用 UI 线程来更新 UI 控件。我猜你正在使用 WinForms,所以我给你文档。在 WinForms 中你会注意到你的 Label 有一个属性 InvokeRequired 如果返回 true 那么你必须调用来更新标签。
猜你喜欢
  • 2013-07-06
  • 2011-01-15
  • 2016-05-21
  • 2016-06-11
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多