C# 使线程等待退出而不诉诸thread.Sleep()
在我的一个应用程序中尝试一个简单的线程操作时,我遇到了一个问题,即试图去理解我做错了什么 我的目标是:我希望主线程产生一个单独的线程;该独立线程将打开一个程序,向该程序提供一个参数(文件名),然后一旦该程序关闭,子线程将终止,主线程可以继续它的工作。我创建了一个非常简单的代码示例来说明。事实上,它甚至不需要是一个单独的线程,它只需要等待程序完成它的工作。我做错了什么?任何帮助都将不胜感激C# 使线程等待退出而不诉诸thread.Sleep(),c#,multithreading,C#,Multithreading,在我的一个应用程序中尝试一个简单的线程操作时,我遇到了一个问题,即试图去理解我做错了什么 我的目标是:我希望主线程产生一个单独的线程;该独立线程将打开一个程序,向该程序提供一个参数(文件名),然后一旦该程序关闭,子线程将终止,主线程可以继续它的工作。我创建了一个非常简单的代码示例来说明。事实上,它甚至不需要是一个单独的线程,它只需要等待程序完成它的工作。我做错了什么?任何帮助都将不胜感激 class Program { static void Main(string[] args)
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Opening....");
var t = new Thread(StartProgram);
t.Start();
t.Join();
Console.WriteLine("Closed");
Console.ReadLine();
}
private static void StartProgram()
{
var startInfo = new ProcessStartInfo();
startInfo.FileName = @"c:\program.exe";
startInfo.Arguments = @"file.txt";
var p = Process.Start(startInfo);
p.WaitForExit();
}
}
你为什么要麻烦启动一个单独的线程?您当前的主要方法可以更简单地重写为:
static void Main(string[] args)
{
Console.WriteLine("Opening....");
StartProgram();
Console.WriteLine("Closed");
Console.ReadLine();
}
StartProgram
正在等待进程退出。。。为什么要引入新线程?也许我遗漏了什么…您实际上不应该在那里使用单独的线程。您特别希望主线程在等待时阻塞,这与为什么要使用线程相反。我想您是在回答自己的问题,为什么要生成另一个线程
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Opening....");
var startInfo = new ProcessStartInfo();
startInfo.FileName = @"c:\program.exe";
startInfo.Arguments = @"file.txt";
var p = Process.Start(startInfo);
p.WaitForExit();
Console.WriteLine("Closed");
Console.ReadLine();
}
}
然而,理想情况下,主线程应该等到子线程完成任务后再退出。 我认为对于join()的使用有些混乱。 这里的t.join()要求主线程等待线程t完成其处理,这与您想要的正好相反
也许我在这里搞错了。好吧,发布使用线程的代码,然后在你的问题中说你实际上不需要它,这不是一个好主意:) 让我们关注真正的问题。Process.WaitForExit()没有失败模式。它是可靠的,这是Windows API中的磐石。所以program.exe确实退出了。如果在WaitForExit()返回后仍然看到程序的副作用,则program.exe可能是一个单实例应用程序 单实例应用程序的典型示例是Microsoft Word。这是一个需要大量机器资源的大型程序,运行多个实例可以快速消耗这些资源。它经过优化,因此即使打开多个文档,也只能运行msword.exe的一个实例。这是通过msword.exe启动small并检查另一个实例是否已在运行来实现的。如果有,它会使用进程间通信工具(如命名管道)与它对话,以通知第一个实例打开文件。然后它很快退出
对此你无能为力。在启动program.exe之前杀死任何正在运行的实例将是一个非常好的Q&D解决方案。好的一点-我假设主线程做了一些超出等待的事情。该死!我正要发布一个答案,但当然,Jon Skeet先做了:)WaitForExit()遇到了什么具体问题?你是说,
p.WaitForExit()没有等待生成的程序退出吗?是的,这是真的,我不需要在这里生成单独的线程,我只需要在程序启动、处理文件和退出时阻止主线程。不幸的是,进程一创建,它就立即退出,而不等待生成的程序。@Robert:您给出的代码将等待您启动的进程完成。这可能只是一个创建另一个进程的包装器吗?我知道这台机器上没有一个与之竞争的program.exe实例,但可能正在发生的是program.exe是其他可执行文件的存根…只是有这样的想法…+1:这是唯一一个甚至试图解决根本问题的答案。其他人则谈到,OP已经承认,不需要单独的线程。