我有一个C#windows窗体应用程序,用于恢复数据库备份。在InitializeComponent()
之后,我调用了运行cmd命令的GetServers()
函数" sqlcmd -L"并填充下拉列表。执行大约需要15-20秒。
因此,当我运行应用程序时,我必须等待主表单出现之前的15-20秒。有没有办法先打开表单,然后运行GetServers()
函数?
private void GetServers()
{
System.Diagnostics.ProcessStartInfo procStartInfo =
new System.Diagnostics.ProcessStartInfo("cmd", "/c sqlcmd -L");
procStartInfo.RedirectStandardOutput = true;
procStartInfo.UseShellExecute = false;
procStartInfo.CreateNoWindow = true;
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo = procStartInfo;
proc.Start();
string processOutput = proc.StandardOutput.ReadToEnd();
var lines = processOutput.Split(
new[] { Environment.NewLine },
StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
{
if (!line.Trim().ToUpper().Contains("SERVERS:"))
cbxServer.Items.Add(line.Trim());
}
}
public Form1()
{
InitializeComponent();
GetServers();
}
答案 0 :(得分:1)
您可以尝试在Form
的{{1}} - 事件中运行您的方法。在使用Shown
完成之前,这仍会导致Form
无响应。在执行UI-thead上的所有代码后,UI始终会更新。
答案 1 :(得分:1)
在这种情况下,您可以使用BackgroundWorker。
首先,修改您的GetServers
方法,使其返回lines
集合而不是处理它。然后你可以做这样的事情(伪代码,可能不完整,但你明白了):
public Form1()
{
InitializeComponent();
var worker = new BackgroundWorker();
worker.DoWork += (sender, e) => e.Result = GetServers();
worker.RunWorkerCompleted += (sender, e) =>
foreach (var line in (string[])e.Result) {/*Here you add the info to your form*/};
worker.RunWorkerAsync();
}