我想在C#中編寫一個簡單的多線程程序。它有一個按鈕,它在窗體上創建一個新的標籤,然後一個for循環運行顯示標籤中的循環值。所以如果你按下按鈕3次,它會在循環的窗體上創建3個帶有3個標籤的線程。簡單的多線程程序在C#不工作
當我按下按鈕一次,它工作正常。但是,當我按下它不止一次創造更多的標籤多,它運行到以下問題:
由於作爲按鈕被按下不止一次很快,它停在前面的線程循環,並運行新的線程循環。如果它是多線程的,那麼它不應該停止第一個循環。
當第二個標籤的循環結束,它給了以下錯誤
不設置到對象
這裏是我的完整代碼的實例
對象引用。引發錯誤的行在最後「mylabel [tcount] .Text = i.ToString();」。
截圖程序:http://i.imgur.com/IFMIs.png
的代碼截圖http://i.imgur.com/sIXtc.png
namespace WindowsFormsApplication2{ public partial class Form1 : Form{ public Form1(){ InitializeComponent(); } private int tcount = 0; private int y_point = 0; Thread[] threads = new Thread[5]; Label[] mylabel = new Label[5]; private void button1_Click(object sender, EventArgs e){ threads[tcount] = new Thread(new ThreadStart(work)); threads[tcount].Start(); } private void work(){ if (this.InvokeRequired){ this.Invoke(new MethodInvoker(delegate{ mylabel[tcount] = new Label(); mylabel[tcount].Text = "label" + tcount; mylabel[tcount].Location = new System.Drawing.Point(0, y_point + 15); y_point += 25; this.Controls.Add(mylabel[tcount]); for (int i = 0; i < 10000; i++){ mylabel[tcount].Text = i.ToString(); Application.DoEvents(); } })); } tcount++; } } }
您不能在主UI線程AFAIK以外的線程中更新'mylabel [tcount] .Text'。 – 2012-01-17 12:51:28
我認爲你在這裏遇到了交叉線程問題,你不應該從一個單獨的線程更新任何UI元素。 [檢查出來](http://stackoverflow.com/questions/661561/how-to-update-gui-from-another-thread-in-c) – musefan 2012-01-17 12:52:12
我建議你閱讀[喬阿爾巴哈里的電子書](http:///www.albahari.com/threading/) - 這是一個很好的介紹 – 2012-01-17 12:54:34