2012-04-04 57 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

相关问题