如何在C#中跟踪和停止正在运行的应用程序(Windows服务)

问题描述 投票:0回答:1

我正在使用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应用程序的最佳做法是什么?

c# cmd process windows-services topshelf
1个回答
1
投票

除非必须,否则不要创建进程。以下是映射网络驱动器的一些代码:

public void mapDrive(string driveLetter, string networkPath, bool isPersistent)
{

    private WshNetwork _networkShell = new WshNetwork();
    object persistent = isPersistent;
    _networkShell.MapNetworkDrive(driveLetter, networkPath, ref persistent) ; 

}

您需要对Windows脚本宿主对象模型的引用。

如果您继续处理异常处理,您将能够更好地控制异常处理。

© www.soinside.com 2019 - 2024. All rights reserved.