Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在等待线程状态为“0”;“停止”;在按钮单击事件中_C#_Multithreading_Winforms_Button - Fatal编程技术网

C# 正在等待线程状态为“0”;“停止”;在按钮单击事件中

C# 正在等待线程状态为“0”;“停止”;在按钮单击事件中,c#,multithreading,winforms,button,C#,Multithreading,Winforms,Button,在按钮控件的单击事件期间,我在等待线程状态时遇到一些问题。 每当我点击我的按钮,它就会执行下面的代码。 问题是它不会等到ThreadState被“停止”,因此它永远不会启用btnImportData或btnExportBellijst 我尝试了t.Join(),但这冻结了我的整个表单,我使用RichTextBox作为记录器,这样会导致记录器冻结几秒钟,然后立即显示大量文本。 我将ImportData函数放在另一个线程上的原因是保持表单运行,以便人们可以实时查看日志 单击我的按钮时我想要的: 更改

在按钮控件的
单击事件期间,我在等待
线程状态时遇到一些问题。
每当我点击我的按钮,它就会执行下面的代码。
问题是它不会等到
ThreadState
被“停止”,因此它永远不会启用
btnImportData
btnExportBellijst

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

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

  • 更改启用的一个或多个按钮的
  • 在另一个线程上运行我的函数
    ImportData
    ,以便我的记录器可以保持日志记录。(
    void ImportData(){}
  • 在我的功能完成后,更改启用的一个或多个按钮的

    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;
        }
    }
    
  • 额外信息:按“导入数据”前的屏幕截图: 应用程序导入数据后的屏幕截图:

    (编辑)目标框架:.NET framework 4

    我最初使用下面的代码,但这会在按下“导入数据”后立即启用所有按钮

    编辑:很抱歉,如果这是错误的分类,我想把它放在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());
        }
    

    这可能会有帮助,谢谢!但是,我很抱歉,因为我忘了提到我使用的是.NETFramework4。我已经更改了任务。运行到Task.Factory.StartNew,但我似乎不知道如何继续工作:什么不工作?继续未执行?我在编译时出错:“委托”System.Action“不接受0个参数”,将“Task.Run”替换为“Task.Factory.StartNew”。(屏幕截图:绿线来自resharper,它们不是一个错误,只是一个建议)编辑:当鼠标悬停在红线上方时,它会显示出来。请尝试继续((任务任务)=>{code here})。编辑了我的答案
    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());
        }