【问题标题】:Threading doesn't execute [duplicate]线程不执行[重复]
【发布时间】:2014-07-16 15:12:30
【问题描述】:

我有简单的应用程序。我有一个数组列表,这个列表包括网站。

单击按钮时出现错误。错误是;

System.Windows.Forms.dll 中发生了“System.InvalidOperationException”类型的第一次机会异常

附加信息:跨线程操作无效:控件“listBox2”从创建它的线程以外的线程访问。

如果有这个异常的处理程序,程序可以安全地继续。

代码如下:

    private void button2_Click(object sender, EventArgs e) {
        for (int i = 0; i < sitelist.Count; i++) {
            Thread thread = new Thread(getStatus);
            thread.Start((string)sitelist[i]);
        }
    }
    private void getStatus(Object obj) {
        listBox2.Items.Add("1");
    }

当我写这样的代码时:

    private void getStatus(Object obj) {
         MessageBox.Show((string)obj);
    }

它有效。为什么我使用列表框时会显示错误?

真诚的。 奥马尔。

【问题讨论】:

  • 您无法从其他线程访问 UI。另请参阅this postthis postthis post
  • 显然,MessageBox.Show 方法没有与列表框相同的线程限制。询问如何从另一个线程更新列表框是完全不同的问题。
  • MessageBox 不会失败,因为它不会访问在主线程上创建的任何句柄,但它会失败,例如,如果您按 CTRL+C

标签: c# multithreading arraylist


【解决方案1】:

你必须使用 BeginInvoke

 private void getStatus(Object obj) {
        this.BeginInvoke(new EventHandler((s,e)=>{listBox2.Items.Add("1")}));
    }

原因是您不能从除主线程之外的任何其他线程触摸属性或影响 WinForm 控件的绘制。您必须将调用编组回主线程,Invoke/BeginInvoke 将为您完成。

【讨论】:

  • +1 但即使是更简单的 MethodInvoker 也能很好地工作 ;)
猜你喜欢
  • 1970-01-01
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 2017-06-19
  • 2023-03-10
相关资源
最近更新 更多