Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何启动kill ASP.NET核心应用程序以重新启动docker容器_C#_Docker_Asp.net Core_Asp.net Web Api_Async Await - Fatal编程技术网

C# 如何启动kill ASP.NET核心应用程序以重新启动docker容器

C# 如何启动kill ASP.NET核心应用程序以重新启动docker容器,c#,docker,asp.net-core,asp.net-web-api,async-await,C#,Docker,Asp.net Core,Asp.net Web Api,Async Await,我有一个在docker容器中运行的简单ASP.NET核心Web API应用程序 此应用程序应处理HTTP请求并使用来自Kafka的事件。所以,在Startup.Configure方法中,我运行带有无限循环的专用线程来使用事件 public void Consume() { Task.Factory.StartNew(async () => { try { while (true) {

我有一个在docker容器中运行的简单ASP.NET核心Web API应用程序

此应用程序应处理HTTP请求并使用来自Kafka的事件。所以,在Startup.Configure方法中,我运行带有无限循环的专用线程来使用事件

public void Consume()
{
    Task.Factory.StartNew(async () =>
    {
        try
        {
            while (true)
            {
                var eventMsg = _consumer.Consume();
                await Handle(eventMsg);
            }
        }
        catch (Exception ex)
        {
            _consumer.Close();
                    // log error
            throw;
        }
    }, TaskCreationOptions.LongRunning);
}
然后在启动时

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseHsts();
            }

            app.UseAuthentication();
            app.UseMvc();

            var consumer = app.ApplicationServices.GetRequiredService<KafkaConsumer>();
            consumer.Consume();
        }
它会停止所有未运行的应用程序和WebAPI

如何正确处理?若短,我需要在后台线程抛出异常,然后关闭应用程序自动重新启动容器。我不能添加
应用程序。退出
消费
方法,因为它是一个库,我不能更改代码

有没有其他方法可以从后台线程杀死应用程序

请让我知道,如果我需要添加更多信息之前关闭它

此应用程序应处理HTTP请求并使用来自Kafka的事件。所以,在Startup.Configure方法中,我运行带有无限循环的专用线程来使用事件

public void Consume()
{
    Task.Factory.StartNew(async () =>
    {
        try
        {
            while (true)
            {
                var eventMsg = _consumer.Consume();
                await Handle(eventMsg);
            }
        }
        catch (Exception ex)
        {
            _consumer.Close();
                    // log error
            throw;
        }
    }, TaskCreationOptions.LongRunning);
}
最重要的是使用托管服务。因此,您的代码如下所示:

public class KafkaConsumer : BackgroundService
{
  public KafkaConsumer()
  {
    _consumer = ...;
  }

  protected override Task ExecuteAsync(CancellationToken stoppingToken) => Task.Run(async () => 
  {
    try
    {
      while (true)
      {
        var eventMsg = _consumer.Consume();
        await Handle(eventMsg);
      }
    }
    catch (Exception ex)
    {
      _consumer.Close();
      ... // log error
      throw;
    }
  });
}
public void ConfigureServices(IServiceCollection services)
{
  services.AddHostedService<KafkaConsumer>();
}
是这样的:

public class KafkaConsumer : BackgroundService
{
  public KafkaConsumer()
  {
    _consumer = ...;
  }

  protected override Task ExecuteAsync(CancellationToken stoppingToken) => Task.Run(async () => 
  {
    try
    {
      while (true)
      {
        var eventMsg = _consumer.Consume();
        await Handle(eventMsg);
      }
    }
    catch (Exception ex)
    {
      _consumer.Close();
      ... // log error
      throw;
    }
  });
}
public void ConfigureServices(IServiceCollection services)
{
  services.AddHostedService<KafkaConsumer>();
}

这不是在ASP.NET核心应用程序中运行后台处理事件的正确方法。不管怎样,你为什么要这么做?Docker的全部要点是,它非常容易运行多个服务。提取所有后台逻辑,将其放入控制台应用程序中,并在其自己的容器中运行。是的,但它使用事件和更新缓存,由控制器读取。将缓存存储在一个公共位置,该位置可供后台服务和web应用程序读取。