我有一個C#窗口應用程序,我在其中創建了某個類的實例,其中有一個窗口窗體的成員,此窗體有一個按鈕,當我單擊但我打開一個可以運行工作線程的新形式,比方說:當窗體運行線程時關閉主應用程序
public static void Main()
{
MyClass mc = new MyClass();
mc.ShowForm();
}
在MyClass.cs:
public void ShowForm()
{
MyFirstForm firstForm = new MyFirstForm();
firstForm.Show();
}
在MyFirstForm.cs
:
private void myButton_Click(object sender, EventArgs e)
{
MySecondForm secondForm = new MySecondForm();
secondForm.Show();
}
在MySecondForm.cs:
private void startButton_Click(object sender, EventArgs e)
{
var worker = new Thread(StartWork);
worker.Start();
}
private void stopButton_Click(object sender, EventArgs e)
{
m_stopped = true;
}
private void StartWork()
{
while(!m_stopped)
{
//work...
}
}
當我運行我的應用程序,點擊myButton的,然後單擊startButton,然後退出我的應用程序(我有一個托盤圖標點擊退出時,調用base.Shutdown() ),第二種形式保持懸掛和不響應。
我原來的問題是,什麼是通知第二種形式,它應該關閉和停止正在運行的線程的最佳方式,但在寫這篇文章時,我注意到我可以使用Task.Factory.StartNew(StartWork);
,當我嘗試它時,它沒有工作一個順利。 所以現在我有另一個問題,這是爲什麼會發生這種情況?
我試過註冊到Closing
,Closed
,FormClosing
事件和設置m_stopped = true
但他們沒有被調用。
編輯: 作爲@drf建議的線程是一個前臺線程因此該應用被阻擋在它運行時,因此添加:
worker.IsBackground = true;
固定它。
設置其母公司 - '.Show(本)',所有的子窗體應該得到與他們的父母 – Sayse 2014-09-01 06:18:20
關閉你可以跟蹤'形式Closing'事件關閉正在運行的線程。 – Hassan 2014-09-01 06:22:21
會將線程上的['IsBackground'](http://msdn.microsoft.com/en-us/library/system.threading.thread.isbackground(v = vs.110).aspx)屬性設置爲true work ? – drf 2014-09-01 06:28:24