使线程等待退出而不诉诸Thread.Sleep()

时间:2010-09-27 16:16:37

标签: c# multithreading

在我的一个应用程序中尝试简单的线程操作时,我遇到了一个问题,试图绕过我做错的事情。

这就是我所追求的:我希望主线程产生一个单独的线程;单独的线程将打开一个程序,为该程序提供一个参数(文件名),然后一旦该程序关闭,子线程将终止,主线程可以继续它的工作。我已经创建了一个非常简单的代码示例来说明。确实,它甚至不是一个单独的线程,它只需要等到程序完成它的工作。我在这做错了什么?任何帮助都将非常感激!

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

}

5 个答案:

答案 0 :(得分:10)

为什么还要打开一个单独的线程?您当前的Main方法可以更简单地重写为:

static void Main(string[] args)
{
    Console.WriteLine("Opening....");

    StartProgram();

    Console.WriteLine("Closed");
    Console.ReadLine();
}

StartProgram已经在等待进程退出...为什么要引入新线程?也许我错过了一些东西......

答案 1 :(得分:2)

好吧,发布使用线程然后在你的问题中说你实际上不需要它的代码并不是一个好主意:)

让我们关注真正的问题。 Process.WaitForExit()没有失败模式。它很稳固,这是Windows API中的摇滚。所以program.exe真的做了退出。如果在WaitForExit()返回后仍然看到程序的副作用,那么program.exe可能是一个单实例应用程序。

单实例应用程序的规范示例是Microsoft Word。这是一个需要大量机器资源的大型程序,运行它的多个实例可以快速消耗它们。它已经过优化,即使您打开多个文档,也只会运行一个msword.exe实例。这可以通过msword.exe启动小并检查另一个实例是否已在运行。如果有,它使用像命名管道之类的进程间通信工具与它通信,告诉第一个实例打开文件。之后它会很快退出。

你无能为力。在启动之前杀死任何正在运行的program.exe实例将是一个非常Q& D的解决方案。

答案 2 :(得分:1)

你实际上不应该在那里使用单独的线程。您特别希望主线程在等待时阻塞,这与您使用线程的原因相反。

答案 3 :(得分:1)

我认为你正在回答你自己的问题,为什么会产生另一个线程?

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

}

答案 4 :(得分:0)

理想情况下,主线程应该等到子线程在退出之前完成其任务。 我认为使用join()有些困惑。 这里的t.join()要求主线程等到线程t完成它的处理,这与你想要的完全相反。

也许我在这里弄错了。