C# 跨线程操作无效

C# 跨线程操作无效,c#,winforms,multithreading,C#,Winforms,Multithreading,亲爱的,当我尝试调用排序方法时,收到以下错误消息: 错误消息:跨线程操作无效:控件“lbStart\u Bubble”是从创建它的线程以外的线程访问的 这里有什么做得不对 Thread thBubble = new Thread(new ThreadStart(bubbleSort)); thBubble.Start(); public void bubbleSort() { int row = 0, column = 0; start = new

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

错误消息:跨线程操作无效:控件“lbStart\u 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] + " " );

    }
Thread thBubble=new Thread(new ThreadStart(bubbleSort));
thBubble.Start();
public void bubbleSort()
{
int行=0,列=0;
start=newtimespan(System.DateTime.Now.Ticks);
lbStart_Bubble.Text=start.ToString();
这个.lbStart_Bubble.Refresh();

对于(row=1;row您不能通过与创建用户界面的线程不同的线程来驱动用户界面。请查看并使用它从后台线程驱动UI。

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

首先,你不能这样使用标签

相反,您可以:

或:

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

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

我将使用Invoke,直到您在线程方面获得更多经验,然后再研究其他方法


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

您应该使用您正在使用的语言标记问题。看起来像Java吗?
lbStart.Invoke(new Action(() =>
{
    lbStart_Bubble.Text = start.ToString();
}));
lbStart.BeginInvoke(new Action(() =>
{
    lbStart_Bubble.Text = start.ToString();
}));