Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使线程等待退出而不诉诸thread.Sleep()_C#_Multithreading - Fatal编程技术网

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已经承认,不需要单独的线程。