线程已在运行时不要执行线程

时间:2015-06-18 12:31:57

标签: c# multithreading

我有一个将日期导出到Excel中的线程。

但是,当我第二次运行Thread时,它可能无法执行..

我的代码:

 if (Thread.CurrentThread == null || Thread.CurrentThread.ThreadState == System.Threading.ThreadState.Stopped)
 {
     new Thread(() =>
     {
         Thread.CurrentThread.Name = "Export to Excel Thread";
         Thread.CurrentThread.IsBackground = true;

         //Code to export to Excel
         // ...
     }).Start();
  }
  else
  {
      MessageBox.Show("Please wait untill the current export is done");
  }

我认为问题是Thread不是if语句中的currentThread。

如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

我会选择TPL。

您可以使用以下内容:

// in your class
private Task _exportTask;

// in your method
if(_exportTask == null || _exportTask.IsCompleted || _exportTask.IsCanceled || _exportTask.IsFaulted)
{
    _exportTask = Task.Factory.StartNew(() => /* Code to export to Excel */);
}
else
{
    MessageBox.Show("Please wait until the current export is done");
}

解释为什么你的代码不起作用:
当前线程永远不能是null,因为这意味着没有线程来执行执行此检查的代码。同样,它也无法停止,因为这又意味着当线程停止时,检查代码将无法执行。
Thread.CurrentThread始终返回正在执行访问Thread.CurrentThread值的代码的线程。

答案 1 :(得分:2)

我认为你应该使用BackgroundWorker类来处理线程化的东西。在第二个导出按钮上,单击只检查IsBusy属性,如果确实如此,则不执行任何操作。祝你好运。

答案 2 :(得分:0)

  

当第一个线程正在运行时(创建Excel)线程可能不会再次执行。直到线程完成并再次单击“导出”按钮!

通过禁用按钮,这可以非常简单。

private void button1_Click(object sender, EventArgs e)
{
    button1.Enabled = false;
    Task.Run(() =>
    {
        // ... do something here

        Invoke((Action)(() => button1.Enabled = true)); // enable button again
    });
}

如果可以从多个地方(按钮,菜单,自动化,调度程序等)调用导出,请参阅其他答案。