我有一个将日期导出到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。
如何解决这个问题?
答案 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
});
}
如果可以从多个地方(按钮,菜单,自动化,调度程序等)调用导出,请参阅其他答案。