C#-重新启动的应用程序冲突"的程序已在运行的"错误
题
当我打电话的应用程序。重新启动()方法,错误出现,检测是否应用程序目前的运行。反正是有围绕这个吗?
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