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'中创建。
答案 0 :(得分:1)
取消引用Thread的好处是,您允许GC收集Thread类所持有的任何数据,但是当您调用Abort时,您将永久stop the thread。由于线程类没有实现IDisposable,因此无法确定性地释放该类持有的任何非托管资源,我们希望Abort能够做到这一点。
Thread类的重量相当轻,除非你有许多MainWindows同时运行,否则它可能不会影响你的内存消耗。但是,如果你知道你再也不会使用它们,那么最好去掉你的对象。
答案 1 :(得分: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
}
}