C#在执行阻塞进程之前执行GUI代码
我(希望)有一个直截了当的问题。我有一个函数,它在隐藏窗口中运行命令提示符命令,并以字符串形式返回响应。这个过程大约需要3秒钟。我想在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
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
。