[英]Closing main app while form is running a thread
我有一個C#Windows應用程序,在其中創建某個類的實例,在該類中,它具有一個成員,該成員是窗口表單,並且此表單具有一個按鈕,當我單擊它時,我將打開一個可以運行工作線程的新表單,可以說:
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;
修復。
我認為要關閉應用程序,您應該使用Application.Exit Method
:
它通知所有消息泵它們必須終止,然后在處理完消息后關閉所有應用程序窗口。
您也可以跟蹤每個表單的FormClosing
事件。 檢查Thread.IsAlive
然后Thread.Abort()
或取消關閉。
您的線程當前是前台線程,它將阻止進程退出直到線程完成。 http://msdn.microsoft.com/zh-CN/library/system.threading.thread.isbackground(v=vs.110).aspx
將您的線程啟動代碼更改為此:
private void startButton_Click(object sender, EventArgs e)
{
var worker = new Thread(StartWork);
worker.IsBackground = true;
worker.Start();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.