我有啓動按鈕單擊事件從主thread.Its名的本地線程如何通過主線程的名稱暫停線程?
「RegistrationThread」。現在我想停止這個線程上的另一個停止按鈕點擊event.How做
我停止了「RegistrationThread」這是一個本地線程,我不能通過它的
名稱訪問此線程。如果我得到「註冊線程」,那麼可以暫停它。這個怎麼做?
我有啓動按鈕單擊事件從主thread.Its名的本地線程如何通過主線程的名稱暫停線程?
「RegistrationThread」。現在我想停止這個線程上的另一個停止按鈕點擊event.How做
我停止了「RegistrationThread」這是一個本地線程,我不能通過它的
名稱訪問此線程。如果我得到「註冊線程」,那麼可以暫停它。這個怎麼做?
中止一個線程通常是度量最後的手段。原因是因爲它會導致很多意想不到的副作用。最佳實踐是允許工作線程在預定的安全點處優雅地結束。這可以通過許多不同的方式正確完成。其中一個最簡單的方法是設置一個標誌,指示工作線程應該開始關閉。
public class YourForm : Form
{
private volatile bool m_Stop = false;
private void StartButton_Click(object sender, EventArgs e)
{
var thread = new Thread(
() =>
{
while (...)
{
// Periodically poll the m_Stop flag.
if (m_Stop)
{
break;
}
}
});
thread.Start();
}
private void StopButton_Click(object sender, EventArgs e)
{
m_Stop = true;
}
}
你如果真的想中止一個線程,那麼你可以隨時保存客場Thread
的引用,然後調用它的Abort
從您的停止按鈕的點擊事件。
放一些優雅的終止檢查的想法聽起來不錯...... – Muse 2010-08-26 13:25:39
據我所知,沒有很好的方法來按名稱查找線程,而Thread.Name基本上只是爲了使調試更容易。爲什麼不直接堅持對線程對象的引用呢?
可以在.net中停止(中止)和暫停另一個線程,但是這兩者都不是特別可取的事情。
它通常被認爲是不好的形式來調用Thread.Abort。通知在另一個線程中運行的代碼是安全的,因此應該放棄並讓它在一個安全的位置自行退出。考慮到MSDN文檔只聲稱在線程「通常」中調用Abort()會中止線程。這應該是一個跡象,表明當結果很重要時,API實際上並不打算使用。
掛起線程至少和放棄線程一樣邪惡 - 如果它持有鎖,掛起它可能導致死鎖。即使你的代碼不包含明確的鎖定,.net運行時也會有很多幕後(例如,用於類初始化),這可能會給你帶來麻煩。因此,微軟在幾年前棄用了Thread.Suspend。
你爲什麼不給我們提供更多關於你想要在更高水平上做什麼的信息,或許我們可以幫助你找到更好的方法。
你能分享代碼嗎? – Jerome 2010-08-26 12:55:58