首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确保在aspnetcore后台服务中启动的进程在web应用程序退出时终止。

问如何确保在aspnetcore后台服务中启动的进程在web应用程序退出时终止。
EN

Stack Overflow用户
提问于 2019-05-15 19:48:46
回答 2查看 109关注 0票数 0

我做了一个后台服务,在aspnet核心web上开发时运行。

代码语言:javascript
复制
public class VueService : BackgroundService
    {
        private readonly Microsoft.Extensions.Hosting.IHostingEnvironment hostingEnvironment;
        private readonly ILogger<VueService> logger;

        public VueService(Microsoft.Extensions.Hosting.IHostingEnvironment hostingEnvironment, ILogger<VueService> logger)
        {
            this.hostingEnvironment = hostingEnvironment;
            this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
        }
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            System.Diagnostics.Process process = new System.Diagnostics.Process()
            {
                EnableRaisingEvents = true
            };

            try
            {

                System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
                // startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
                startInfo.FileName = "cmd.exe";
                startInfo.Arguments = "/C npm run serve";
                startInfo.WorkingDirectory = hostingEnvironment.ContentRootPath;
                process.StartInfo = startInfo;

                // redirect the output
                process.StartInfo.RedirectStandardOutput = true;
                process.StartInfo.RedirectStandardError = true;
                // hookup the eventhandlers to capture the data that is received
                process.OutputDataReceived += (sender, args) => logger.LogInformation(args.Data);
                process.ErrorDataReceived += (sender, args) => logger.LogError(args.Data);




                // direct start
                process.StartInfo.UseShellExecute = false;

                process.Start();

                // start our event pumps
                process.BeginOutputReadLine();
                process.BeginErrorReadLine();


                while (!stoppingToken.IsCancellationRequested)
                {
                    await Task.Delay(1000);
                }

            }catch(Exception ex)
            {

            }
            finally
            {
                try
                {
                    process.Kill();
                }
                catch (Exception)
                {

                }
            }
        }
    }

当应用程序停止/调试结束时,我如何确保它不会挂起?

EN

回答 2

Stack Overflow用户

发布于 2019-05-16 12:03:24

如果您的后台服务是nodejs服务,请在您的启动类中尝试这样做

代码语言:javascript
复制
//ConfigureServices
services.AddNodeServices(node => node.ProjectPath = Path.GetFullPath("path/to/nodejs/project"));

//Configure
app.UseSpa(spa =>
{
    app.ApplicationServices.GetRequiredService<INodeServices>().InvokeAsync<object>("path/to/your/entry.js");
    spa.UseProxyToSpaDevelopmentServer("http://localhost:3000"); //remove it if you don't need asp.net core application to proxy for your background service
});

它可以正确地终止nodejs服务,即使在被终止的web应用程序上也是如此。

票数 1
EN

Stack Overflow用户

发布于 2019-05-15 20:53:28

ASP.NET Core hosted services (包括BackgroundService实例)在进程内运行。当进程退出时,它们将被终止。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56148654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档