我刚刚发布了这个帖子,但是我解决了另一个问题,又遇到了另外一个问题。我即将把这个程序部署到28个托管机器上,所以我想在我这样做之前确保它正常工作。
我写了一个小的c#NET应用程序,它基本上是Java应用程序的包装器,当我的应用程序启动,Java应用程序启动,应用程序关闭,关闭等等。
一切正常,但是当我关闭应用程序时,Java应用程序继续运行。当我创建进程时,我将Process var存储在方法之外的变量中,然后在我的应用程序进入关闭时使用它。无论出于何种原因,它都没有终止Java应用程序。
class Program
{
private static Process minecraftProcess;
public static void LaunchMinecraft(String file, String memoryValue)
{
String memParams = "-Xmx" + memoryValue + "M" + " -Xms" + memoryValue + "M ";
String args = memParams + "-jar " + file + " nogui";
ProcessStartInfo processInfo = new ProcessStartInfo("java.exe", args);
processInfo.CreateNoWindow = true;
processInfo.UseShellExecute = false;
try
{
//using (Process minecraftProcess = Process.Start(processInfo))
using (minecraftProcess = Process.Start(processInfo))
{
minecraftProcess.WaitForExit();
}
}
catch
{
// Log Error
}
}
static void Main(string[] args)
{
Arguments CommandLine = new Arguments(args);
// Hook ProcessExit Event
AppDomain.CurrentDomain.ProcessExit += new EventHandler(Current_ProcessExit);
if (CommandLine["file"] != null && CommandLine["memory"] != null)
{
// Launch the Application (Command Line Parameters)
LaunchMinecraft(CommandLine["file"], CommandLine["memory"]);
}
else
{
// Launch the Application (Default Parameters)
LaunchMinecraft("minecraft_server.jar", "1024");
}
}
static void Current_ProcessExit(object sender, EventArgs e)
{
System.Threading.Thread.Sleep(10000);
// If we have an active Minecraft Service, Shut it down
if (minecraftProcess != null)
{
minecraftProcess.Kill();
}
}
}
答案 0 :(得分:0)
Sleep
处理程序中无法ProcessExit
。
所有人的总执行时间 ProcessExit事件处理程序有限, 就像总的执行时间一样 所有终结者在过程中都是有限的 关掉。默认值为两秒。 非托管主机可以更改此设置 通过调用执行时间 ICLRPolicyManager :: SetTimeout方法 使用OPR_ProcessExit枚举 值。
答案 1 :(得分:0)
没关系,我刚刚意识到minecraftProcess变量是静态的。
答案 2 :(得分:0)
不知道你是否自己没有解决这个问题,但是:
您应该知道实例(返回bool)和静态(返回对象)有 Start 方法。
你不应该使用使用而不是使用局部变量!
这应该可以正常工作:
minecraftProcess = Process.Start(processInfo)
minecraftProcess.WaitForExit();