进一步编辑 以下不是生产代码 - 我只是在玩几个类试图弄清楚如何在线程中运行进程 - 或者即使这是可行的。我已经在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();
}
}
这不是......
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();
}
}
为什么第二个与第一个不一样?在第二个脚本中,我试图使用Threadstart委托传递Process.Start
...我认为这可以是一个void
方法吗?
第一个脚本是唯一的选项,还是可以稍微更改第二个脚本,以便它有效地执行与第一个脚本相同的工作,即在指定的线程中启动记事本实例?
修改
关于为什么我正在玩这个代码的一些背景:最终我需要构建一个同时运行多个Excel进程的应用程序。当VBA错误导致对话框时,这些过程可能会很麻烦。所以我想如果每个进程都在一个线程中运行,那么如果一个特定的线程已经运行了太长时间,那么我可以杀死该线程。我是Threads / Processes的新手,所以现在基本上可以玩弄各种可能性。
答案 0 :(得分:20)
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();
...但是建议检查返回值:
ThreadStart ths = new ThreadStart(() => {
bool ret = pr.Start();
//is ret what you expect it to be....
});
当然,一个进程在一个新进程(一组完全独立的线程)中启动,所以在一个线程上启动它是完全没有意义的。
答案 1 :(得分:7)
您可以进行更改
ThreadStart ths = new ThreadStart(delegate() { pr.Start(); });
答案 2 :(得分:4)
使用此代码正常启动该过程:
Process.Start("notepad.exe");
创建线程来运行新进程没有任何意义,也没有任何好处。这就像运行一个批处理文件,当你可以直接执行“cmd.exe”时执行“cmd.exe”...你只是在做什么,而不是什么是必要的。不要重新发明轮子并轻松玩耍:P
答案 3 :(得分:1)
没有直接回答OP,但是由于该线程帮助我跟踪了正确的方向,所以我想回答这个问题:
“在线程上启动它完全没有意义”
我有一个.Net服务器,它使用NodeJS作为其TCP套接字管理器。我希望NodeJS写入与.Net服务器相同的输出,并且它们都并行运行。因此,在新线程中打开允许我使用
processNodeJS.BeginErrorReadLine()
processNodeJS.BeginOutputReadLine()
processNodeJS.WaitForExit()
同时不阻止.Net服务器的主线程。
我希望这对某人有意义,如果您有更好的方法来实现我刚刚描述的内容,我会很高兴听到。
答案 4 :(得分:1)
您可以使用此关键字下面的start关键字在另一个线程中启动该过程:
Process.Start("start notepad.exe");
通过这种方式,运行记事本时GUI程序不会冻结。