當用戶執行一個非常耗時的操作時,如果不借助Thread編程,用戶就會感覺界面反映很遲鈍。在.Net 2.0中可以通過BackgroundWork非常方便地進行Thread編程
//使用BackgroundWorker控件
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;
}
void test()
{
String[] s = { "111", "222" };
for (int i = 0; i < s.Length; i++)
{
comboBox1.Items.Add(s[i]);
}
}
private void Form1_Load(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
test();
}
}
//使用Thread
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//CheckForIllegalCrossThreadCalls = false;
//不使用CheckForIllegalCrossThreadCalls線程間操作控件就要使用委託
}
void bind()
{
this.BeginInvoke(new testdelegate(test));
}
delegate void testdelegate();
void test()
{
String[] s = { "111", "222" };
for (int i = 0; i < s.Length; i++)
{
comboBox1.Items.Add(s[i]);
}
}
private void Form1_Load(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(bind));
t.Start();
}
}
線程間操作無效:
訪問 Windows 窗體控件本質上不是線程安全的。如果有兩個或多個線程操作某一控件的狀態,則可能會迫使該控件進入一種不一致的狀態。還可能出現其他與線程相關的 bug,包括爭用情況和死鎖。確保以線程安全方式訪問控件非常重要。
.NET Framework 有助於在以非線程安全方式訪問控件時檢測到這一問題。在調試器中運行應用程序時,如果創建某控件的線程之外的其他線程試圖調用該控件,則調試器會引發一個 InvalidOperationException,並提示消息:“從不是創建控件 control name 的線程訪問它。”
此異常在調試期間和運行時的某些情況下可靠地發生。強烈建議您在顯示此錯誤信息時修復此問題。在調試以 .NET Framework 2.0 版之前的 .NET Framework 編寫的應用程序時,可能會出現此異常。
可以通過將 CheckForIllegalCrossThreadCalls 屬性的值設置爲 false 來禁用此異常。這會使控件以與在 Visual Studio 2003 下相同的方式運行。