繁体   English   中英

跨线程操作无效

[英]Cross-thread operation not valid

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

错误消息:跨线程操作无效:控制从创建它的线程以外的线程访问的“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] + " " );

    }

您不能与来自不同线程的控件进行通信,而不是创建的控件,因此拥有该控件。

所以对于一个人来说,你不能像这样使用标签。

相反,您可以调用BeginInvoke

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

要么:

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

区别在于第一个将等到主线程(拥有标签的线程)在它(后台线程)继续执行之前执行了代码。 可以想象它有一个常规的方法调用,它只是发生在不同的线程上。

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

我会使用Invoke,直到你获得更多的线程经验,然后研究替代方案。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM