【问题标题】:Wpf threadpool implementationwpf线程池实现
【发布时间】:2013-04-19 12:29:07
【问题描述】:

我必须在我的项目中对数据表进行验证,但它应该在不同的后台线程上运行,而不是主 UI 线程。一旦完成,它应该在屏幕上显示错误列表。此验证从不同的地方运行,有 6 到 7 个地方可能会导致数据表错误。我编写了以下函数,可以从这 6 到 7 个地方调用它来执行验证:

Thread validationThread = null;

    public void RunDataTableValidation()
        {      
                validationThread = new Thread(new ThreadStart(() => validationHandler()));
                validationThread.Name = "DataGridValidationThread";
                validationThread.IsBackground = true;
                validationThread.Start();
            }
        }

    public void validationHandler(Label FakeLabel)
        {

         try { //all validation code}

         finally
            {
                System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() => ProcessingDone()));
            }
        }

      void ProcessingDone()
        {          
            if (validationThread != null && validationThread.ThreadState ==   ThreadState.Stopped)
           {
                validationThread.Abort();
            }           
        }

我的问题是:每次我在线程完成工作后中止线程。但是如果当前线程仍在运行并且其他一些代码调用此函数并启动新线程,我也想中止线程。我知道我可以使用 ThreadPool 但请帮助我 - 我如何在上面的代码中实现线程池?所以它会在启动新线程之前自动杀死线程池中所有正在运行的线程

编辑:

       public void RunDataTableValidation()
        {
           ThreadPool.QueueUserWorkItem(o =>
            {
                try
                {
                    validationHandler();

                }
                catch (NotSupportedException) { }
            });
      }

      public void validationHandler(Label FakeLabel)
      {

        try
        {
            foreach (DataRow drRow in this.CurrentDataTable.Rows)
            {

            }     
            Thread.Sleep(7000); ( i put sleep right now for testing becoz this code takes few secs becoz of 500+ rows of datagrid         
        }
        finally
        {
            System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() => ProcessingDone()));
        }

    }

【问题讨论】:

    标签: wpf threadpool implementation


    【解决方案1】:

    切勿致电Thread.Abort()。例如,请参阅 here 以获得解释。在您的示例代码中甚至没有必要,因为 Thread 从您传递给其构造函数的方法返回时会自动终止。

    无论如何,只需在 QueueUserWorkItem 的 ThreadPool 线程中运行您的验证方法:

    private bool terminate;
    
    public void TerminateThread()
    {
        terminate = true;
    }
    
    public void RunDataTableValidation()
    {    
        ThreadPool.QueueUserWorkItem(
            o =>
            {
                try
                {
                    while (!terminate)
                    {
                        // all validation code
                    }
                }
                finally
                {
                    Dispatcher.BeginInvoke((Action)ProcessingDone);
                }
                terminate = false;
            });
    }
    
    private void ProcessingDone()
    {
        // update the UI here
    }
    

    【讨论】:

    • 我唯一的问题是,在你的情况下,如果有前一个线程正在运行而新线程刚刚启动,该怎么办。我想杀死以前的线程。
    • 你不会杀死一个线程。只需从线程方法返回。例如,您可能有一个由线程方法定期检查的终止标志。
    • 我尝试了您的代码,但它影响了我的 UI 线程。请在编辑中查看我的代码:
    • 你能分享一下如何设置终止标志选项,并从方法返回的例子。可能是我不太擅长穿线
    • 我明白你在说什么,但它影响了我的 UI 线程。它使我的 UI 操作非常缓慢。它应该在后台运行,并且只在屏幕末尾显示错误。但我的问题是为什么它不在后台运行。
    猜你喜欢
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 2021-01-31
    • 2013-07-10
    • 2014-04-12
    • 2012-10-24
    • 2018-09-23
    相关资源
    最近更新 更多