如何在线程中启动进程

why*_*heq 10 c#


进一步编辑 以下不是生产代码 - 我只是在试图弄清楚如何在线程中运行进程 - 或者即使这是可行的.我已经在MSDN上阅读了各种定义,但对线程和进程来说是新手,因此任何对文章的进一步明确引用都将不胜感激


这可以...

class Program {
    static void Main(string[] args) {

        Notepad np = new Notepad();
        Thread th = new Thread(new ThreadStart(np.startNPprocess));
        th.Start();

        Console.WriteLine("press [enter] to exit");
        Console.ReadLine();
    }
}

public class Notepad {

    public void startNPprocess() {

        Process pr = new Process();
        ProcessStartInfo prs = new ProcessStartInfo();
        prs.FileName = @"notepad.exe";
        pr.StartInfo = prs;
        pr.Start();     

    }
}
Run Code Online (Sandbox Code Playgroud)

这不是......

class Program {
    static void Main(string[] args) {


        Process pr = new Process();
        ProcessStartInfo prs = new ProcessStartInfo();
        prs.FileName = @"notepad.exe";
        pr.StartInfo = prs;

        ThreadStart ths = new ThreadStart(pr.Start);
        Thread th = new Thread(ths);
        th.Start();


        Console.WriteLine("press [enter] to exit");
        Console.ReadLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么第二个与第一个不一样?在第二个脚本中,我试图Process.Start使用Threadstart委托传递...我认为这可以作为一个void方法吗?第一个脚本是唯一的选项,还是可以稍微更改第二个脚本,以便它有效地执行与第一个相同的工作,即在指定的线程中启动记事本的实例?


编辑

关于为什么我要使用这段代码的一些背景知识:最终我需要构建一个同时运行多个Excel进程的应用程序.当VBA错误导致对话框时,这些过程可能会很麻烦.所以我想如果每个进程都在一个线程中运行,那么如果一个特定的线程已经运行了太长时间,那么我可以杀死该线程.我是Threads/Processes的新手,所以基本上可以玩弄当前的可能性.

spe*_*der 25

ThreadStart需要一个返回void的委托.Process.Start返回bool,因此不是兼容的签名.您可以通过使用lambda来吞下返回值,该lambda为您提供正确返回类型(即void)的委托,如下所示:

    Process pr = new Process();
    ProcessStartInfo prs = new ProcessStartInfo();
    prs.FileName = @"notepad.exe";
    pr.StartInfo = prs;

    ThreadStart ths = new ThreadStart(() => pr.Start());
    Thread th = new Thread(ths);
    th.Start();
Run Code Online (Sandbox Code Playgroud)

...但是检查返回值可能是明智的:

    ThreadStart ths = new ThreadStart(() => {
        bool ret = pr.Start();
        //is ret what you expect it to be....
    });
Run Code Online (Sandbox Code Playgroud)

当然,一个进程在一个新进程(一组完全独立的线程)中启动,因此在一个线程上启动它是完全没有意义的.

  • 很酷,这是我需要的线!...`当然,一个进程是从一个新进程(一堆完全独立的线程)开始的,因此在线程上启动它是完全没有意义的。 (4认同)
  • 如果我的线程是一个telnet进程并且我需要读取输出而我的其他应用程序没有被阻止,这并非毫无意义.如果我启动进程等待文本...但仍然需要发送命令并等待更多响应,它只是阻塞因为telnet永远不会结束进程.所以从另一个线程开始并将来自其他进程线程的输出委托给我的线程到客户端是有道理的,直到我明确地调用exit,杀死两个线程.但是..这是正确的做法..不知道.MS称之为交互协议进程,但没有示例如何处理它. (3认同)
  • Downvoter,请用这个答案解释你认为有问题的东西,这样我就可以改进它. (2认同)

Rah*_*ble 7

你可以做出改变

ThreadStart ths = new ThreadStart(delegate() { pr.Start(); });
Run Code Online (Sandbox Code Playgroud)