2010-08-26 50 views
3

我有啓動按鈕單擊事件從主thread.Its名的本地線程如何通過主線程的名稱暫停線程?

「RegistrationThread」。現在我想停止這個線程上的另一個停止按鈕點擊event.How做

我停止了「RegistrationThread」這是一個本地線程,我不能通過它的

名稱訪問此線程。如果我得到「註冊線程」,那麼可以暫停它。這個怎麼做?

+0

你能分享代碼嗎? – Jerome 2010-08-26 12:55:58

回答

1

中止一個線程通常是度量最後的手段。原因是因爲它會導致很多意想不到的副作用。最佳實踐是允許工作線程在預定的安全點處優雅地結束。這可以通過許多不同的方式正確完成。其中一個最簡單的方法是設置一個標誌,指示工作線程應該開始關閉。

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從您的停止按鈕的點擊事件。

+0

放一些優雅的終止檢查的想法聽起來不錯...... – Muse 2010-08-26 13:25:39

1

據我所知,沒有很好的方法來按名稱查找線程,而Thread.Name基本上只是爲了使調試更容易。爲什麼不直接堅持對線程對象的引用呢?

可以在.net中停止(中止)和暫停另一個線程,但是這兩者都不是特別可取的事情。

它通常被認爲是不好的形式來調用Thread.Abort。通知在另一個線程中運行的代碼是安全的,因此應該放棄並讓它在一個安全的位置自行退出。考慮到MSDN文檔只聲稱在線程「通常」中調用Abort()會中止線程。這應該是一個跡象,表明當結果很重要時,API實際上並不打算使用。

掛起線程至少和放棄線程一樣邪惡 - 如果它持有鎖,掛起它可能導致死鎖。即使你的代碼不包含明確的鎖定,.net運行時也會有很多幕後(例如,用於類初始化),這可能會給你帶來麻煩。因此,微軟在幾年前棄用了Thread.Suspend。

你爲什麼不給我們提供更多關於你想要在更高水平上做什麼的信息,或許我們可以幫助你找到更好的方法。