如何创建应用程序的第二个实例?

时间:2010-11-09 03:25:16

标签: c# wpf

我希望为启动时通过命令行参数传递给它的每个文件路径创建我的应用程序的新实例。

现在我在主窗口的构造函数中有这个:

if (args.Length > 0)
        {
            for (int i = 0; i < args.Length; i++)
            {
                string arg = args[i];

                if (File.Exists(arg))
                {
                    if (i > 0)
                        Process.Start(System.Reflection.Assembly.GetExecutingAssembly().Location, arg);
                    else
                        OpenFile(arg);
                }
            }
        }

但是,现在我的程序似乎创建了自己的新实例,直到我的计算机运行我们的内存。你看到了什么问题吗?

- 编辑 -

Args来自Appplication.OnStartup事件的覆盖。

4 个答案:

答案 0 :(得分:3)

删除对if (args.Length > 0)的检查,因为for循环会处理这个问题。如果您需要跳过arg 0(如SLaks所建议的那样),只需将for循环更改为int i = 1

请注意,如果您始终将参数传递给子流程,并且您的检查基于其任何参数,那么您将无限递归。

所以这一行应该改变:

if (i > 0)
    // Spawn new process, passing the argument

要:

if (i > 1)
    // Spawn new process, passing the argument

此外,此代码相当令人困惑,正如此处的答案所证明的那样。这里有更简单的代码:

foreach (string arg in args.Skip(2)) // Just Skip(1) if it turns out args[0] != this.exe
    Process.Start(System.Reflection.Assembly.GetExecutingAssembly().Location, arg);

if (args.Length > 1) // > 0 if it turns out args[0] != this.exe
    OpenFile(args[1]);

答案 1 :(得分:1)

将其更改为

Process.Start(typeof(MainWindow).Assembly.Location, "\"" + arg + "\"");

(引用参数)

如果arg来自带空格的带引号的路径,则将其传递给Process.Start会将未加引号的值作为两个参数传递。你需要在它周围加上引号以确保你只得到一个参数。

更改第一个参数会使其更短且更快,但不会改变行为。

答案 2 :(得分:1)

答案:我是个白痴。

出于测试目的,我对一些args进行了硬编码,这些args随后会产生新的实例。

通过电脑屏幕随意指点笑或向我扔鸡蛋。

答案 3 :(得分:0)

如果您的目标是允许所有处理同时运行,为什么不直接使用线程?

foreach (var i in args) {
    new Thread(delegate {
        try { OpenFile(i); }
        catch (Exception e) { Console.WriteLine("Error processing file {0}: {1}",
                                                i, e.ToString()); }
    }).Start();
}