我有一个WPF应用程序,我有这个类:
public partial class Global : UserControl
{
public static List<Thread> listofthreads = new List<Thread>();
public Global()
{
InitializeComponent();
Thread windowThread = new Thread(delegate() { verifing(); });
listofthreads.Add(windowThread);
windowThread.Start();
}
public void verifing()
{
if (Global2.Pat_pathregfile.Length > 5 && Global2.Pat_pathcalibfile.Length > 5) {
if (utilisation.Dispatcher.CheckAccess())
{
utilisation.Visibility = Visibility.Visible;
}
else
{
utilisation.Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() =>
{
utilisation.Visibility = Visibility.Visible;
}));
}
foreach (Thread t in listofthreads) {
try
{
t.Suspend();
}
catch { }
}
}
else {
if (utilisation.Dispatcher.CheckAccess())
{
utilisation.Visibility = Visibility.Hidden;
}
else
{
utilisation.Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() =>
{
utilisation.Visibility = Visibility.Hidden;
}));
}
Thread windowThread = new Thread(delegate() { verifing(); });
windowThread.Start();
listofthreads.Add(windowThread);
}
}
}
我需要杀死properly
我使用过的所有线程
foreach (Thread t in listofthreads) {
try
{
t.Suspend();
}
catch { }
}
但该程序表明不建议使用方法suspend
。
答案 0 :(得分:2)
1)为什么?
Suspend
方法已由Microsoft标记为Obsolete
。错误表明了自己:
Thread.Suspend已被弃用。请使用其他课程 System.Threading,如Monitor,Mutex,Event和Semaphore,to 同步线程或保护资源。
2)似乎有些线程即使在收盘后仍然有效 窗户,为什么会这样?我该如何解决?
您已启动所有线程foreground thread
,当主线程完成执行时,它不会自动停止。如果您想在所有前台线程停止后停止所有线程,则应将线程标记为background thread
。
windowThread.IsBackground = true;
3)wpf中是否存在另一种杀死线程的方法?
使用Thread.Abort()。但是,关闭主线程将自动停止所有后台线程( IsBackground在线程上设置为true),你不应该担心杀死它们。
答案 1 :(得分:1)
你想做什么?您是为了检查某些条件而创建线程的?当条件为真时,您可以更改可见性并阻止所有线程(!)进一步执行。当条件不成立时,您创建另一个执行相同操作的线程。为什么要暂停所有线程(包括活动线程)而不是让它终止?如果您想定期检查条件,请改用计时器或等待事件。
正如旁注:你的foreach循环最终会抛出InvalidOperationException
,因为你在没有锁的情况下改变了集合。
然后,不要试图杀死线程。请改用标志或信号。任何杀死线程的企图都是a)糟糕的设计和b)容易出错和意外行为。