C#在执行阻塞进程之前执行GUI代码

C#在执行阻塞进程之前执行GUI代码,c#,user-interface,blocking,C#,User Interface,Blocking,我(希望)有一个直截了当的问题。我有一个函数,它在隐藏窗口中运行命令提示符命令,并以字符串形式返回响应。这个过程大约需要3秒钟。我想在GUI中添加一个简单的标签,在函数执行之前显示。标签只是说明正在检查某些内容,因此用户不会认为界面太慢或没有响应 下面是一个示例片段进行说明 svnPathCheck_lbl.Visible = true; //Show the label // Check validity of SVN Path st

我(希望)有一个直截了当的问题。我有一个函数,它在隐藏窗口中运行命令提示符命令,并以字符串形式返回响应。这个过程大约需要3秒钟。我想在GUI中添加一个简单的标签,在函数执行之前显示。标签只是说明正在检查某些内容,因此用户不会认为界面太慢或没有响应

下面是一个示例片段进行说明

        svnPathCheck_lbl.Visible = true; //Show the label     

        // Check validity of SVN Path
        string svnValidity = getCMDOutput("svn info " + SVNPath_txtbox.Text);

        // Here we call Regex.Match. If there is a 'Revision:' string, it was successful
        Match match = Regex.Match(svnValidity, @"Revision:\s+([0-9]+)", RegexOptions.IgnoreCase);

        svnPathCheck_lbl.Visible = false; //Hide the label
getCMDOutput()
函数运行隐藏命令并阻止GUI

我所期望的是显示我的标签“Checking…”,然后运行阻塞函数
getCMDOutput()
。一旦函数返回并且GUI再次响应,它就会隐藏标签

相反,我从来没有看到标签出现在所有。它几乎就像从未执行过一样。是否在GUI有机会更新之前执行阻塞功能


谢谢你的帮助

我建议您异步运行
getCMDOutput
方法

如果这是一个windows窗体应用程序,则可以使用
BackgroundWorker
执行此操作。处理工作进程的事件DoWork以调用您的方法,并在您之前调用它的位置,放置backgroundWorker1.RunWorkerAsync()

这将导致该方法在新的thead中运行,因此UI更新将被单独处理,并且将是即时的。

尝试以下操作:

svnPathCheck_lbl.Visible = true; //Show the label     
Task connectToSVN = new Task(() => { this.connectToSVN; }); connectToSVN.Start(); //Open new Task to complite the code without blocking the GUI.

private void connectToSVN 
{
    // Check validity of SVN Path
    string svnValidity = getCMDOutput("svn info " + SVNPath_txtbox.Text);

    // Here we call Regex.Match. If there is a 'Revision:' string, it was successful
    Match match = Regex.Match(svnValidity, @"Revision:\s+([0-9]+)", RegexOptions.IgnoreCase);
    this.Dispatcher.Invoke((Action)(() =>
    {
       svnPathCheck_lbl.Visible = false; //Hide the label
    }
    ));
}

试试这个代码,它应该可以工作

    private void button1_Click(object sender, EventArgs e)
    {
        svnPathCheck_lbl.Text = "Checking...";
        svnPathCheck_lbl.Visible = true;

        BackgroundWorker bw = new BackgroundWorker();
        bw.DoWork += bw_DoWork;
        bw.RunWorkerCompleted += bw_WorkCompleted;
        bw.RunWorkerAsync();
    }

    private void bw_WorkCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        svnPathCheck_lbl.Text = "Work completed";
    }

    private void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        string svnValidity = getCMDOutput("svn info " + SVNPath_txtbox.Text);
        Match match = Regex.Match(svnValidity, @"Revision:\s+([0-9]+)", RegexOptions.IgnoreCase);
    }

此处可能存在跨线程错误。如果
Task
在非UI线程上执行,则它不能直接调用
SVNPath\u txtbox.Text