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

本文关键字:显示 冻结 然后 应用程序 | 更新日期: 2023-09-27 18:27:42

我是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();
}

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

谢谢。

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

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

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.");
}

这将异步地阻止进度。