应用程序冻结然后立即显示所有内容

时间:2015-12-21 19:16:53

标签: c# wpf multithreading

我是C#的新手,我需要一些帮助。

在我的应用程序中,我希望在几个相当长时间运行的任务之前显示某种日志消息(例如“启动任务1”),以显示脚本在过程中的位置。

但不是做:显示日志,执行任务,显示日志,执行下一个任务等等。应用程序冻结,不显示任何内容,然后一旦完成所有“繁重”任务,它就会显示每个日志。

我原以为它会显示一个日志,然后在一个任务中冻结,然后显示另一个日志,然后再次冻结下一个任务,但它会在函数开头时冻结。

这是我的代码示例:

public void Work(string src, string spl)
{
    log("=======================");
    string cmd = ...; // some arguments for external exe

    var proc = new System.Diagnostics.Process
    {
        StartInfo = new System.Diagnostics.ProcessStartInfo
        {
            FileName = ..., // some external app
            Arguments = cmd,
            UseShellExecute = false,
            RedirectStandardOutput = false,
            CreateNoWindow = true
        }
    };

    log("Task 1 started. Please wait...");
    proc.Start();
    proc.WaitForExit();
    proc.Close();
    log("Task 1 done.");
}

public void log(string message)
{
    ScrollContent.Text += "\n" + message;
}

现在我正在学习线程和Task类,但它似乎不起作用。我试过这个:

public void Work(string src, string spl)
{

    // same as before

    log("Task 1 started. Please wait...");

    Task.Factory.StartNew(() => StartProc(proc)).Wait;

    log("Task 1 done.");
}

public void StartProc(System.Diagnostics.Process proc)
{
    proc.Start();
    proc.WaitForExit();
    proc.Close();
}

所以它可以在另一个线程中执行繁重的任务,但是不行,它仍然在函数的开头冻结,直到它完成。我可能做错了什么,但我不知道是什么。

谢谢。

1 个答案:

答案 0 :(得分:2)

当你像这样使用Wait时,你正在等待进程同步而不是异步结束。您应该将Work方法更改为:

public async Task Work(string src, string spl)
{

    // same as before

    log("Task 1 started. Please wait...");

    await Task.Factory.StartNew(() => StartProc(proc));

    log("Task 1 done.");
}

将异步阻止进度。