1

我必须在我的项目中对数据表进行验证,但它应该在不同的后台线程上运行,而不是在主 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()));
        }

    }
4

1 回答 1

0

从不打电话Thread.Abort()。例如,请参见此处以获取解释。在您的示例代码中甚至没有必要,因为 Thread 从您传递给其构造函数的方法返回时会自动终止。

无论如何,只需通过以下方式在 ThreadPool 线程中运行您的验证方法QueueUserWorkItem

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
}
于 2013-04-19T13:14:38.880 回答