2012-04-04 91 views
0
public partial class MainWindow : window 
{ 
    private Thread t = new Thread; 

    private void btnSend_Click(object sender, RoutedEventArgs e) 
    { 
     if (t != null) 
     { 
      if (t.IsAlive == true) 
      { 
       t.Abort(); 
       t = null; //Is this correct? should I free this before making null? 
       return; 
      } 

      t = new Thread(send.Image); 
      t.Start();  
     } 
    } 
} 

上面的代碼顯示了一個事件處理程序。當我按下一個名爲「發送」的按鈕時,應創建新的過程。當我點擊同一個按鈕時,程序應該停止。然後我再次按'發送',過程應該重新開始。線程應該創建在同一個對象't'中。應該釋放線程對象嗎? C#

+2

您是否真的想根據用戶輸入中止上次發送?不知道發送什麼。圖像很難說,但這看起來不正確。背景工作者可能是更好的選擇。中止應該留給特殊情況,這與殺死一個過程沒有什麼不同,只有在沒有其他選擇的情況下才能完成,你應該有很多。 – 2012-04-04 08:58:52

+0

考慮使用更抽象的usign線程方式,至少使用線程池或更好的TPL。關於使用waitHandle的 – 2012-04-04 09:00:38

回答

1

取消引用Thread的好處在於,您允許GC收集Thread類所保存的任何數據,但是當您調用Abort時,您永久需要stop the thread。由於線程類不實現IDisposable,因此無法確定性地釋放該類所擁有的任何非託管資源,我們希望Abort能夠做到這一點。

Thread類的重量相當輕,除非您有許多MainWindows運行在相同的位置,否則它可能不會影響您的內存消耗。然而,如果你知道你永遠不會再使用它們,那麼最好是去引用你的對象。

1

這在技術上是確定這樣做,但你必須這樣做,這樣說:

private Thread t; // initially null 
private void btnSend_Click(object sender, RoutedEventArgs e) 
{ 
    if (t != null) 
    { 
     t.Abort(); 
     t = null; 
    } 
    else 
    { 
     t = new Thread(send.Image); 
     t.Start();  
    } 
} 

而且,它也許沒有好的設計調用Abort

您可以改爲使用循環檢查WaitHandle的方式實現您的線程方法。這使線程能夠以受控方式終止:

private Thread t; // initially null 
private AutoResetEvent waitHandle = new AutoResetEvent(false); 

private void btnSend_Click(object sender, RoutedEventArgs e) 
{ 
    if (t != null) 
    { 
     waitHandle.Set(); // signal thread termination 
     t = null; 
    } 
    else 
    { 
     t = new Thread(ThreadMethod); 
     t.Start();  
    } 
} 

private void ThreadMethod() 
{ 
    TimeSpan waitTime = TimeSpan.FromSeconds(1); 
    while (!waitHandle.WaitOne(waitTime)) 
    { 
     // do something 
    } 
} 
+0

,問題是,線程方法'send.Image'花費太多時間。大約9個小時。我通過點擊UI窗口的'發送'按鈕來啓動線程。這幾個小時,我的UI主窗口應該保持響應。我同意'if-else'。它應該被優化。 – SHRI 2012-04-04 10:11:02

相關問題