劇情簡介:我在做什麼線程錯誤?
我試圖將非線程應用程序轉換爲線程應用程序。我在大約10年的時間裏沒有在應用程序中使用線程,並且對這個概念非常生疏。這只是我沒有抓住的東西。你能看看我的(很短的)代碼之前和之後,看看我做錯了什麼,爲什麼它是錯的?所有幫助非常感謝!謝謝!
錯誤看出:
我的代碼沒有響應。我可以運行並執行這些按鈕來啓動應用程序,但不會啓動一個新線程而只是工作,它們會凍結並顯示「無響應」消息。我不確定我做錯了什麼。我是否錯誤地實現了線程?
非線程代碼:
//this opens the user input windows form
private void UserInputButton_Click(object sender, EventArgs e)
{
enumerationStation EnumerationForm = new enumerationStation();
EnumerationForm.Show();
//userform UserForm = new userform();
//UserForm.Show();
}
//this opens the correlationApplication windows form
private void CorrelationApplication_Click(object sender, EventArgs e)
{
CorrelationApplication CorrelationApplicationForm = new CorrelationApplication();
CorrelationApplicationForm.Show();
}
破碎線程代碼:
//this opens the user input windows form
private void UserInputButton_Click(object sender, EventArgs e)
{
BackgroundWorker bg = new BackgroundWorker();
bg.DoWork += new DoWorkEventHandler(enumerationStuff);
bg.RunWorkerAsync();
}
//run enumeration application in new thread
private void enumerationStuff(object sender, DoWorkEventArgs e)
{
enumerationStation EnumerationForm = new enumerationStation();
EnumerationForm.Show();
}
//this opens the correlationApplication windows form
private void CorrelationApplication_Click(object sender, EventArgs e)
{
BackgroundWorker bg = new BackgroundWorker();
bg.DoWork += new DoWorkEventHandler(correlationStuff);
bg.RunWorkerAsync();
}
//run correlation application in new thread
private void correlationStuff(object sender, DoWorkEventArgs e)
{
CorrelationApplication CorrelationApplicationForm = new CorrelationApplication();
CorrelationApplicationForm.Show();
}
簡單的回答:不要這樣做。使用線程進行昂貴的計算。使用TPL。 – SLaks 2012-08-01 13:10:40
我敢肯定,從UI線程中打開新的UI形式是一個壞主意。 – asawyer 2012-08-01 13:12:38
另外,好像你是從backgroundworker調用UI方法:'EnumerationForm.Show();'。這應該會爲您彈出一個例外。您應該只在主線程上使用UI方法,並使用其他線程來完成與其他線程無關的其他任務。 – devundef 2012-08-01 13:13:52