2013-12-11 37 views
0

我有(希望)一个简单的问题。我有一个函数在隐藏窗口中运行命令提示符命令,并以字符串形式返回响应。这个过程大约需要3秒钟。我想在我的GUI中添加一个简单的标签,该标签会在函数执行之前出现。该标签只是指出正在检查某些内容,因此用户不认为该界面太慢或无响应。C#在执行阻塞过程之前执行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。

我希望这样做是显示我的标签“检查...”,然后运行阻止功能getCMDOutput()。一旦函数返回并且GUI再次响应,它将隐藏标签。

相反,我从来没有看到标签出现。它几乎像它从未执行过。是否可以在GUI有机会更新之前执行阻塞函数?

感谢您的帮助!

回答

1

试试这个代码,它应该工作...

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

我建议您以异步方式运行getCMDOutput方法。

如果这是一个Windows窗体应用程序,你可以使用BackgroundWorker来做到这一点。处理工作人员的事件DoWork以调用您的方法,并在之前调用它的位置,请改为backgroundWorker1.RunWorkerAsync()

这将导致该方法在新的thead中运行,因此UI更新将被分别处理并将瞬间。

0

试试这个:

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 
    } 
    )); 
} 
+0

可能跨线程错误在这里。如果'Task'在非UI线程上执行,那么它不能直接调用'SVNPath_txtbox.Text'。 – groverboy