等待ThreadState为“0”;已停止”;在按钮单击事件中
本文关键字:按钮 单击 事件 ThreadState 等待 | 更新日期: 2023-09-27 17:58:11
在按钮控件的Click
事件期间等待ThreadState
时遇到一些问题。每当我点击按钮时,它都会执行下面的代码。这个问题是它不会等到ThreadState
"停止",所以它永远不会启用btnImportData
或btnExportBellijst
。
我尝试过t.Join()
,但它冻结了我的整个表单,并且我使用RichTextBox
作为记录器,所以这会导致记录器冻结几秒钟,然后一次显示大量文本。我将ImportData
函数放在另一个线程上的原因是为了保持表单的运行,这样人们就可以实时查看日志。
当我点击按钮时,我想要什么:
- 更改1个或多个按钮的
Enabled
- 在另一个线程上运行我的函数
ImportData
,这样我的记录器就可以继续记录了。(void ImportData(){}
) -
在我的功能完成后,更改1个或多个按钮的
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#中。
使用任务并行库可以让它变得更容易:
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());
}