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'中创建。

4

2 回答 2

1

取消引用 Thread 的好处是您允许 GC 收集 Thread 类保存的任何数据,但是当您调用 Abort 时您会永久停止线程。由于线程类没有实现 IDisposable,因此无法确定性地释放该类持有的任何非托管资源,我们希望 Abort 能够做到这一点。

Thread 类的重量相当轻,除非您同时运行许多 MainWindows,否则它可能不会影响您的内存消耗。但是,如果您知道您将永远不会再次使用它们,最好取消引用您的对象。

于 2012-04-04T08:58:58.053 回答
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
    }
}
于 2012-04-04T09:14:02.577 回答