在Button Click事件中等待ThreadState“停止”

时间:2014-04-14 14:59:03

标签: c# multithreading winforms button

在按钮控件的ThreadState事件期间等待Click时,我遇到了一些问题。 每当我点击我的按钮时,它都会执行下面的代码。 这样做的问题是它不会等到ThreadState被“停止”,因此它永远不会启用btnImportDatabtnExportBellijst

我已经尝试了t.Join()但冻结了我的整个表单并使用RichTextBox作为记录器,这样就会导致记录器冻结几秒钟然后显示很多立刻发短信。 我将ImportData函数放在另一个Thread上的原因是为了使表单保持运行,以便人们可以实时看到日志。

单击我的按钮时我想要的是什么:

  1. 更改一个或多个按钮的Enabled
  2. 在另一个线程上运行我的函数ImportData,以便我的记录器可以继续记录。 (void ImportData(){}
  3. 在我的功能完成后,更改一个或多个按钮的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;
        }
    }
    
  4. 额外信息:按“导入数据”之前的屏幕截图: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#中。

1 个答案:

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