当我打电话的应用程序。重新启动()方法,错误出现,检测是否应用程序目前的运行。反正是有围绕这个吗?

    static void Main(string[] args)
    {
        string proc = Process.GetCurrentProcess().ProcessName;
        Process[] processes = Process.GetProcessesByName(proc);
        if (processes.Length > 1)
        {
            MessageBox.Show("Program is already running.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        else
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
有帮助吗?

解决方案

最有效的方式来做到这一点是继承的VB.Net's WindowsFormsApplicationBase 类,这也可以使用,并设置 IsSingleInstance 酒店来 true.这种使用互斥,并将继续工作,如果该文件被重新命名。

其他提示

使用一个互斥。例如为:一个实例应用关闭时最小化到系统托盘。这个例子是更复杂的可能比你所需要的,但使用互斥的基本单实例概念效果很好。

我也有类似的问题,但我是关系到不可收拾的内存泄漏,我不能对具有全天候运行的应用程序找到。随着客户我认为安全的时间重新启动应用程序是上午03时,如果内存消耗超过规定值。

我试过Application.Restart,但因为它似乎使用一些启动,而它已经在运行新实例的机制,我去了另一个方案。我使用的文件系统处理一直持续到创建它们进程死掉的伎俩。因此,从应用程序,我放弃了文件到硬盘,并没有Dispose()手柄。我用要发送的文件“自己”的可执行,并且还开始目录(以添加的灵活性)。

代码:

_restartInProgress = true;
string dropFilename = Path.Combine(Application.StartupPath, "restart.dat");
StreamWriter sw = new StreamWriter(new FileStream(dropFilename, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite));
sw.WriteLine(Application.ExecutablePath);
sw.WriteLine(Application.StartupPath);
sw.Flush();
Process.Start(new ProcessStartInfo
{
    FileName = Path.Combine(Application.StartupPath, "VideoPhill.Restarter.exe"),
    WorkingDirectory = Application.StartupPath,
    Arguments = string.Format("\"{0}\"", dropFilename)
});
Close();

Close()在年底将启动的应用程序停机,我用于StreamWriter此文件句柄将保持打开,直到过程真的死了。然后...

Restarter.exe进入动作。它试图读取以独占模式文件,防止它来访问,直到主应用程序并没有死,然后启动主应用程序,删除文件和存在。我想,它不能是简单的:

static void Main(string[] args)
{
    string filename = args[0];
    DateTime start = DateTime.Now;
    bool done = false;
    while ((DateTime.Now - start).TotalSeconds < 30 && !done)
    {
        try
        {
            StreamReader sr = new StreamReader(new FileStream(filename, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite));
            string[] runData = new string[2];
            runData[0] = sr.ReadLine();
            runData[1] = sr.ReadLine();
            Thread.Sleep(1000);
            Process.Start(new ProcessStartInfo { FileName = runData[0], WorkingDirectory = runData[1] });
            sr.Dispose();
            File.Delete(filename);
            done = true;
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        Thread.Sleep(1000);
    }
}

您可以尝试重启代码挂钩到的 Application.ApplicationExit 事件作为侦听方法。然后,你会打电话给Application.Exit导致代码来间接运行。

修改:添加代码示例:

例如,当用户点击重新启动按钮或应用决定重新启动,调用此RestartMeSmartly()方法。你会不会担心弄虚作假 - 它会工作

void RestartMeSmartly() {
    Application.ApplicationExit += BeforeExiting;
    Application.Exit();
}

void BeforeExiting(object sender, EventArgs args) {
    Application.Restart();
}

要做到这一点的最简单的方法是在退出前添加的延迟。

换句话说,

string proc = Process.GetCurrentProcess().ProcessName;
if (Process.GetProcessesByName(proc).Length > 1) {
    Thread.Sleep(500);      //500 milliseconds; you might need to wait longer
    if (Process.GetProcessesByName(proc).Length > 1) {
        MessageBox.Show("Program is already running.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return;
    }
}    //no else
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top