主要目标是关闭流程,而不要留下任何挂起的连接,子流程。
[有一个简单的服务每天24/7运行,它每分钟都会检查是否有任何新作业要启动。如果找到一个,则开始其
public Process StartProcess(string pathToExecutable, string arguments)
{
var processStartInfo = new ProcessStartInfo
{
FileName = pathToExecutable,
Arguments = arguments,
UseShellExecute = false,
CreateNoWindow = true
};
return Process.Start(processStartInfo);
}
以及尝试关闭时
public bool TryCloseProcess(Process process, int waitSeconds)
{
try
{
process.CloseMainWindow();
process.WaitForExit(waitSeconds);
return true;
}
catch (Exception)
{
return false;
}
}
确保所有资源都将被释放的任何正确方法,等等?
您需要在开始的过程中着重于资源清理和正常退出。
您不能远程执行此操作,因此您在此调度程序应用中执行的操作足以向启动的进程发送消息以使其停止。
启动的过程应处理其余的过程。 (正常退出)
当您停止一个进程时,无论您是否Dispose()
将其释放的任何托管(和非托管)资源都将被释放。
不会有内存泄漏,因为完整的工作集将由您的操作系统释放。
您应该考虑的是是否正在进行正在进行的后台处理(由您启动的,未标记IsBackground = true的线程将继续运行并防止应用程序关闭),Tasks您已经启动,并且应该实现正常退出用于任何类型的外部连接等。
如果其中一个任务在该确切时刻写入文件,则该文件将被部分写入。如果线程此时正在执行某些网络IO,则将被中断。它将与远端过早断开连接。您无需担心内存和处理泄漏,但应考虑对此类进程(文件IO,网络IO等)进行平稳停止。
您的finalizers将在终止期间被调用。这是进行清理的好地方。
另请参阅how to use a cancellation token在任务即将被取消时停止任务。
希望这会有所帮助。