繁体   English   中英

等待线程状态在按钮单击事件中“停止”

[英]Waiting for a ThreadState to be “Stopped” in a Button Click Event

我在按钮控件的Click事件期间等待ThreadState时遇到一些问题。 每当我单击我的按钮时,它将执行以下代码。 问题在于它不会等到ThreadState被“停止”,所以它永远不会启用btnImportDatabtnExportBellijst

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

单击按钮时我想要的东西:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM