【问题标题】:Cross-thread operation not valid跨线程操作无效
【发布时间】:2011-07-11 21:26:24
【问题描述】:

亲爱的,当我尝试调用排序方法时,我收到以下错误消息:

错误消息:跨线程操作无效:控件“lbStart_Bubble”从创建它的线程以外的线程访问。

这里做错了什么!?

Thread thBubble = new Thread(new ThreadStart(bubbleSort));
thBubble.Start();


public void bubbleSort()
    {
        int row = 0, column = 0;

        start = new TimeSpan(System.DateTime.Now.Ticks);
        lbStart_Bubble.Text = start.ToString();
        this.lbStart_Bubble.Refresh();

        for(row = 1; row <= list1.Length; row++)
        {
            for(column =0; column < list1.Length-1; column++)
            {

                Thread.Sleep(delay);
                tbResult_Bubble.Clear();
                for(int i=0; i<list1.Length; i++)
                    tbResult_Bubble.AppendText(list1[i] + " " );

                if(list1[column]>list1[column+1])
                    swap(list1[column], list1[column+1], column, column+1);
            }
            display(list1);
        }

        end = new TimeSpan(System.DateTime.Now.Ticks);
        lbEnd_Bubble.Text = end.ToString();

        lbTotal_Bubble.Text = end.Subtract(start).ToString();

        tbResult_Bubble.Clear();

        for(int i=0; i<list1.Length; i++)
            tbResult_Bubble.AppendText(list1[i] + " " );

    }

【问题讨论】:

  • 您应该用您使用的语言标记问题。看起来像 Java?

标签: c# winforms multithreading


【解决方案1】:

您不能通过与创建它的线程不同的线程来驱动用户界面。查看 Control.Invoke 并使用它从后台线程驱动 UI。

【讨论】:

    【解决方案2】:

    您不能与来自与创建并因此拥有该控件的线程不同的线程中的控件对话。

    因此,您不能那样使用标签。

    相反,您可以InvokeBeginInvoke

    lbStart.Invoke(new Action(() =>
    {
        lbStart_Bubble.Text = start.ToString();
    }));
    

    或:

    lbStart.BeginInvoke(new Action(() =>
    {
        lbStart_Bubble.Text = start.ToString();
    }));
    

    不同之处在于,第一个线程会等到主线程(拥有标签的线程)执行完代码,然后它(后台线程)才会继续执行。想想它有一个常规的方法调用,它只是发生在不同的线程上。

    第二个只会向拥有标签的线程发送一封邮件,要求它执行这段代码,然后不等待它。这可能很难正确处理,例如,如果 start 在主线程开始执行该代码之前在后台线程中更改怎么办?

    我会使用 Invoke,直到您获得更多线程方面的经验,然后再寻找替代方案。

    或者,您可以使用BackgroundWorker,它可以安全地将进度消息发送回主线程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多