如何在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服务)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 模拟器启动时停止应用程序请求跟踪

如何使用开始和停止 UIButtons 连续跟踪位置坐标并查找距离 [关闭]

如何在Matlab中停止正在运行的脚本[重复]

当我“关闭” UISwitch 时,后台位置服务跟踪不会停止

.gitignore 不会停止在文件中跟踪更改

如何跟踪和调试Windows服务