我有一个批处理文件,它运行一个用 C# 编写的控制台应用程序。
此应用程序会将一些文件从一个文件夹移动到另一个应用程序,并在数据库中创建一个条目。
批处理文件计划每 10 分钟运行一次。
如果一个 .exe 运行并在 10 分钟后启动相同 .exe 的另一个实例,会不会有任何问题?
如果 .exe 的另一个实例在 10 分钟后启动并且之前的 .exe 实例仍在运行,会发生什么情况?
我有一个批处理文件,它运行一个用 C# 编写的控制台应用程序。
此应用程序会将一些文件从一个文件夹移动到另一个应用程序,并在数据库中创建一个条目。
批处理文件计划每 10 分钟运行一次。
如果一个 .exe 运行并在 10 分钟后启动相同 .exe 的另一个实例,会不会有任何问题?
如果 .exe 的另一个实例在 10 分钟后启动并且之前的 .exe 实例仍在运行,会发生什么情况?
我建议强制您的可执行文件只允许一个实例。
有一个关于如何在 C# 中使用互斥锁运行单个实例的问题,答案中提供 的链接显示了一个很好的示例。
单个实例将坚决防止任何数据库/文件访问异常。如果它每十分钟运行一次,我认为在另一个实例已经在运行时取消它不是一个坏主意,如果不是,你总是可以提前几分钟安排一个新的。
你可以尝试各种各样的事情。
或许,查询正在运行的进程并在前一个实例正在运行时退出。
或者,您可以检查文件是否正在文件复制程序中使用(文件观察程序中使用的典型方法)。
我有一个类似的问题,我所做的是编写一个快速控制台应用程序作为应用程序的界面。
在主循环中,我编写了代码来获取计算机上运行的进程,并检查实例是否已经启动。如果不是,我启动了我的可执行文件。
Process[] iProcesslist = Process.GetProcesses();
foreach (Process process in iProcesslist)
{
if (process.ProcessName == "programName")
{
Log.Debug("ProgramName is currently running. Please wait for it to exit before launching again");
return 0;
}
else
{
using (var p = new Process())
{
try
{
p.StartInfo.FileName = @"C:\Users\username\Documents\Programming_Projects\programName\ProgramName\bin\Debug\programName.exe";
p.Start();
p.WaitForExit();
}
catch (Exception ex)
{
Log.Debug(ex.Message);
}
}
}
}
可能不是最好的解决方案,但它很快并且可以满足我的需求。