在按钮控件的ThreadState
事件期间等待Click
时,我遇到了一些问题。
每当我点击我的按钮时,它都会执行下面的代码。
这样做的问题是它不会等到ThreadState
被“停止”,因此它永远不会启用btnImportData
或btnExportBellijst
。
我已经尝试了t.Join()
但冻结了我的整个表单并使用RichTextBox
作为记录器,这样就会导致记录器冻结几秒钟然后显示很多立刻发短信。
我将ImportData
函数放在另一个Thread上的原因是为了使表单保持运行,以便人们可以实时看到日志。
单击我的按钮时我想要的是什么:
Enabled
。ImportData
,以便我的记录器可以继续记录。 (void ImportData(){}
)在我的功能完成后,更改一个或多个按钮的Enabled
。
private void btnImportData_Click(object sender, EventArgs e)
{
//Disable current button
btnImportData.Enabled = false;
imgBonne.Visible = false; //random image
rtConsole.Visible = true; //RichTextBox logger
//Create a new thread for the button function
var t = new Thread(ImportData);
t.Start();
//It does NOT wait until thread stopped
while (t.ThreadState == ThreadState.Stopped)
{
//Never gets executed
btnImportData.Enabled = true;
btnExportBellijst.Enabled = true;
}
}
额外信息:按“导入数据”之前的屏幕截图:http://puu.sh/88oD6.png 应用程序导入数据后的屏幕截图:http://puu.sh/88oNT.png
(编辑)目标框架:.NET Framework 4
我最初使用下面的代码,但是在按下“导入数据”后,这会立即启用所有按钮。
private void btnImportData_Click(object sender, EventArgs e)
{
imgBonne.Visible = false; //random image
rtConsole.Visible = true; //RichTextBox logger
var t = new Thread(ImportData);
t.Start();
while (t.ThreadState == ThreadState.Running)
{
btnImportData.Enabled = false;
}
btnImportData.Enabled = true;
btnExportBellijst.Enabled = true;
}
修改:如果这个类别错误,我很抱歉,我想把它放在c#中。
答案 0 :(得分:1)
使用Task Parallel Library可以让它变得更容易:
private void btnImportData_Click(object sender, EventArgs e)
{
imgBonne.Visible = false; //random image
rtConsole.Visible = true; //RichTextBox logger
btnImportData.Enabled = false;
Task.Run(ImportData).ContinueWith((Task task) =>
{
btnImportData.Enabled = true;
btnExportBellijst.Enabled = true;
}, TaskScheduler.FromCurrentSynchronizationContext());
}