应用程序冻结,然后立即显示所有内容
本文关键字:显示 冻结 然后 应用程序 | 更新日期: 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.");
}
这将异步地阻止进度。