亲爱的,当我尝试调用排序方法时,我收到错误消息:
错误消息:跨线程操作无效:控制从创建它的线程以外的线程访问的“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] + " " );
}
答案 0 :(得分:7)
您无法与创建的控件之间的控件进行通信,从而拥有该控件。
因此,对于一个人来说,你不能像这样使用标签。
相反,您可以Invoke或BeginInvoke:
lbStart.Invoke(new Action(() =>
{
lbStart_Bubble.Text = start.ToString();
}));
或:
lbStart.BeginInvoke(new Action(() =>
{
lbStart_Bubble.Text = start.ToString();
}));
不同之处在于,第一个将等到主线程(拥有标签的线程)在它(后台线程)继续执行之前执行了代码。可以想象它有一个常规的方法调用,它只是发生在不同的线程上。
第二个只是向拥有该标签的线程发送邮件,要求它执行该段代码,然后不等待它。这样做是很棘手的,例如,如果在主线程执行该代码之前start
在后台线程中发生了什么变化?
我会使用Invoke,直到你获得更多线程经验,然后研究替代方案。
或者,您可以使用具有设施的BackgroundWorker将进度消息安全地发送回主线程。
答案 1 :(得分:1)
您无法通过与创建用户界面的线程不同来驱动用户界面。查看Control.Invoke
并使用它来从后台线程中驱动UI。