如何在C#中跟踪和停止正在运行的应用程序(Windows服务)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在C#中跟踪和停止正在运行的应用程序(Windows服务)相关的知识,希望对你有一定的参考价值。
我正在使用Topshelf库开发一个Windows服务...我想启动cmd并从我的网络映射一个文件夹并从中运行一个控制台应用程序。
这是我的全班:
class ClientService
{
private Scheduler ServiceScheduler { get; set; }
private Process MyApp{ get; set; }
private Config ConfigFile { get; set; }
public void Start()
{
ServiceScheduler = new Scheduler(6000) { Enabled = true };
ServiceScheduler.Elapsed += Scheduler_Elapsed;
ConfigFile =Config.get();
ConfigMyApp();
}
private void ConfigMyApp() => ConfigMyApp= new Process
{
StartInfo =
{
CreateNoWindow = false,
ErrorDialog = false,
UseShellExecute = false,
RedirectStandardInput = true,
FileName = "CMD.exe",
}
};
private void Scheduler_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (Network.CurrentHourMin == ConfigFile.StartTime)
{
MyApp.Start();
using (var sw = MyApp.StandardInput)
{
if (sw.BaseStream.CanWrite)
{
//Map My Folder Network
sw.WriteLine("pushd \\MyNetwork\General\");
//Run MyApp with Args
sw.WriteLine(MyApp -run -args -others);
}
}
}
else if (Network.CurrentHourMin == ConfigFile.EndTime)
{
//////////
How To stop running MyApp.exe
//////////
}
}
public void Stop()
{
}
}
问题是我无法关闭以前从cmd.exe运行并执行MyApp.Close的MyApp.exe将不会停止运行应用程序,并且根本没有任何影响。
甚至来自Topshelf服务的Calling Stop方法(或停止服务)也不会停止运行MyApp在这种情况下退出或终止Console应用程序的最佳做法是什么?
答案
除非必须,否则不要创建进程。以下是映射网络驱动器的一些代码:
public void mapDrive(string driveLetter, string networkPath, bool isPersistent)
{
private WshNetwork _networkShell = new WshNetwork();
object persistent = isPersistent;
_networkShell.MapNetworkDrive(driveLetter, networkPath, ref persistent) ;
}
您需要对Windows脚本宿主对象模型的引用。
如果您继续处理异常处理,您将能够更好地控制异常处理。
以上是关于如何在C#中跟踪和停止正在运行的应用程序(Windows服务)的主要内容,如果未能解决你的问题,请参考以下文章
如何使用开始和停止 UIButtons 连续跟踪位置坐标并查找距离 [关闭]