等待ThreadState为“0”;已停止”;在按钮单击事件中

本文关键字:按钮 单击 事件 ThreadState 等待 | 更新日期: 2023-09-27 17:58:11

在按钮控件的Click事件期间等待ThreadState时遇到一些问题。每当我点击按钮时,它都会执行下面的代码。这个问题是它不会等到ThreadState"停止",所以它永远不会启用btnImportDatabtnExportBellijst

我尝试过t.Join(),但它冻结了我的整个表单,并且我使用RichTextBox作为记录器,所以这会导致记录器冻结几秒钟,然后一次显示大量文本。我将ImportData函数放在另一个线程上的原因是为了保持表单的运行,这样人们就可以实时查看日志。

当我点击按钮时,我想要什么:

  1. 更改1个或多个按钮的Enabled
  2. 在另一个线程上运行我的函数ImportData,这样我的记录器就可以继续记录了。(void ImportData(){}
  3. 在我的功能完成后,更改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#中。

等待ThreadState为“0”;已停止”;在按钮单击事件中

使用任务并行库可以让它变得更容易:

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());
    }