我是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();
}
所以它可以在另一个线程中执行繁重的任务,但是不行,它仍然在函数的开头冻结,直到它完成。我可能做错了什么,但我不知道是什么。
谢谢。
答案 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.");
}
将异步阻止进度。