在长时间运行的方法完成之前,表格不会出现

时间:2015-05-19 09:39:15

标签: c# winforms

我有一个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();
}

2 个答案:

答案 0 :(得分:1)

您可以尝试在Form的{​​{1}} - 事件中运行您的方法。在使用Shown完成之前,这仍会导致Form无响应。在执行UI-thead上的所有代码后,UI始终会更新。

您应该查看BackgroundWorkerasyncronous methods

答案 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();
}