由于多線程可能導(dǎo)致對控件訪問的不一致,導(dǎo)致出現(xiàn)問題。C#中默認是要線程安全的,即在訪問控件時需要首先判斷是否跨線程,如果是跨線程的直接訪問,在運行時會拋出異常。
解決辦法有兩個:
1、不進行線程安全的檢查
2、通過委托的方式,在控件的線程上執(zhí)行
public partial class
Form1 : Form |
//System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls
= false; |
private void
button1_Click(object sender,
EventArgs e) |
Thread th1 = new
Thread(new
ThreadStart(CalNum));
|
//button1.Enabled = false;
|
for (int i = 1; i <
100000000; i++) |
//button1.Enabled = true;
|
//方法二:檢查是否跨線程,然后將方法加入委托,調(diào)用委托
|
public delegate void
SetTextHandler(int result);
|
private void
SetCalResult(int result)
|
if (label2.InvokeRequired == true)
|
SetTextHandler set = new SetTextHandler(SetCalResult);//委托的方法參數(shù)應(yīng)和SetCalResult一致
|
label2.Invoke(set, new object[] { result });
//此方法第二參數(shù)用于傳入方法,代替形參result
|
label2.Text = result.ToString();
|
|