首页 > 其他分享 >WPF开发中遇到的新知识 -- 1

WPF开发中遇到的新知识 -- 1

时间:2022-09-25 09:12:34浏览次数:41  
标签:process CTRL -- 知识 private Process static StartInfo WPF

前后台同时启动的方式

目的:希望在WPF前台启动后,带动 ASP.NET Core 后台服务一同启动,在前台关闭后,也一起关闭

方法:在打开窗口之前,首先手动打开 ASP.NET Core 子进程,然后注册窗口关闭回调,通知后台关闭进程

public static class ExternalProcessFactory
    {

        private static Process Process;

        public static Process GetApp()
        {
            if (Process != null)
            {
                return Process;
            }

            Process process = new Process();
            //var app = Environment.CurrentDirectory + "/xxx.exe";
            var app = "D:\\xxx.exe";
            process.StartInfo.FileName = app;
            process.StartInfo.UseShellExecute = false;
            process.StartInfo.RedirectStandardOutput = false;
            process.StartInfo.RedirectStandardError = false;
            process.StartInfo.RedirectStandardInput = false;
            process.StartInfo.CreateNoWindow = false;
            //process.StartInfo.WorkingDirectory = Environment.CurrentDirectory;
            process.StartInfo.WorkingDirectory = "D:\\workspace";
            Process = process;
            return process;
        }

        public static void Close(int? timeoutMilliseconds = null)
        {
            if (Process == null || Process.HasExited)
            {
                return;
            }

            if (AttachConsole((uint)Process.Id))
            {
                SetConsoleCtrlHandler(null, true);

                GenerateConsoleCtrlEvent(CtrlTypes.CTRL_C_EVENT, 0);

                FreeConsole();

                if (timeoutMilliseconds != null)
                {
                    Process.WaitForExit(timeoutMilliseconds.Value);
                }
                else
                {
                    Process.WaitForExit();
                }

                SetConsoleCtrlHandler(null, false);
            }
        }

        [DllImport("kernel32.dll")]
        private static extern bool AttachConsole(uint dwProcessId);

        [DllImport("kernel32.dll")]
        private static extern bool FreeConsole();

        [DllImport("kernel32.dll")]
        private static extern bool SetConsoleCtrlHandler(ConsoleCtrlDelegate? HandlerRoutine, bool Add);

        [DllImport("kernel32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool GenerateConsoleCtrlEvent(CtrlTypes dwCtrlEvent, uint dwProcessGroupId);

        enum CtrlTypes : uint
        {
            CTRL_C_EVENT = 0,
            CTRL_BREAK_EVENT,
            CTRL_CLOSE_EVENT,
            CTRL_LOGOFF_EVENT = 5,
            CTRL_SHUTDOWN_EVENT
        }

        private delegate bool ConsoleCtrlDelegate(CtrlTypes ctrlTypes);
    }

大部分代码都是查询了如何发送 CTRL_C 信号给控制台应用,使得可以优雅关闭的代码,剩下的只需要编写创建子进程的部分,我们需要填充一些子进程的基本信息

  • CreateNoWindow,如果不需要子进程打开窗口,而是后台运行,可以设置为 true
  • WorkingDirectory,这个比较重要,如果不设置启动的环境,可能会出现配置文件读取不成功的问题
  • FileName,我是直接将两个项目发布到同一个文件夹下,所以只需要 Environment.CurrentDirectory 就可以找到了

标签:process,CTRL,--,知识,private,Process,static,StartInfo,WPF
From: https://www.cnblogs.com/huangwenhao1024/p/16727234.html

相关文章

  • NodeJS的安装
    前言虽然这些东西很基本也很简单,但是过段时间就会遗忘,有空记录下吧,反正也不耗费多少时间,后期至少比百度快点。安装步骤Linux下的安装下载安装包下载地址:http://nodejs......
  • WPF开发中遇到的新知识 -- 3
    WPF中Nlog日志组件的使用目的:希望在WPF的运作中,记录一些关键操作的信息,记录一些错误发生的信息方法:查阅一些资料发现,大部分组件的方式都是在ASP中直接通过服务的形式注册......
  • WPF开发中遇到的新知识 -- 2
    RestSharp的简单使用目的:希望在WPF应用中发送HTTP请求,获取后台数据方法:在网上的一些搜索结果中,推荐使用的方式有HttpClient、HttpClientFactory、refit和RestSharp,其中......
  • token 登录模式了解过吗 ?
    token是服务器端生成的一个字符串,当作客服端请求的一个令牌,在第一次登陆成功之后,服务器端会生成一个token,客户端必须要携带token才能请求数据token的具体逻辑如下:......
  • nacos 临时实例与持久实例
    nacos临时实例与持久实例一、两者区别 临时实例   默认情况,服务实例仅会注册在Nacos内存,不会持久化到Nacos磁盘,其健康检测机制为Client模式,即Client主动向Server上报......
  • P8548 小挖的买花
    小挖的买花题目背景小挖喜欢买花,但是ta太懒了!所以这个任务全权交给了你。题目描述花店里只有\(n\)株花,每一株花都有三个属性:价格\(cost_i\)、美丽度\(be_i\)、新......
  • seata的部署和集成
    seata的部署和集成一、部署Seata的tc-serverwindow版安装1.下载首先我们要下载seata-server包,地址在http://seata.io/zh-cn/blog/download.html   2.解压在非......
  • 讲讲回流和重绘的区别,如何避免回流和重绘?
    回流:当元素的尺寸,结构属性改变,浏览器需要重新渲染部分或全部文档流的过程浏览器首次加载元素尺寸位置改变元素内容改变字体大小改变添加删除dom元素重绘:元素样......
  • typedef 结构体类型名可以相同
    typedefstructWebsMime{ char*type;/**<Mimetype*/ char*ext;/**<Fileextension*/}WebsMi......
  • CSS边框
    一、CSSborder属性用于指定元素边框的样式、宽度和颜色。即使用border-style,通过设置其适当的值来更改样式。border-style允许的值包括:--dotted:定义点线边框。--dash......