在wpf应用程序中挂起一个线程

时间:2013-12-25 11:11:59

标签: c# wpf multithreading thread-safety threadpool

我有一个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

  1. 为什么?
  2. 似乎有些线程即使在关闭窗口后仍在工作,为什么会发生这种情况?我该如何解决?
  3. 是否存在另一种杀死线程的方法?wpf?

2 个答案:

答案 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)容易出错和意外行为。