我有一个使用IService
s构建的控制台应用程序,如下所示:
class Program
{
static void Main(string[] args)
// ...
var serviceToUse = args[0];
var host = Host.CreateDefaultBuilder()
.ConfigureServices((context, services) => {
switch (serviceToUse) {
case "first": { services.AddTransient<IService, AlphaService>(); break; }
case "second": { services.AddTransient<IService, BetaService>(); break; }
}
})
.UseSerilog()
.Build();
IService svc;
if (serviceToUse == "alpha") {
svc = ActivatorUtilities.CreateInstance<AlphaService>(host.Services);
}
else {
svc = ActivatorUtilities.CreateInstance<BetaService>(host.Services);
}
List<Entity> entities = Common.GetEntities();
svc.Run(modeToUse, entities);
}
我的服务如下:
public class AlphaService : IHostedService {
public AlphaService(ILogger<AlphaService> log, IConfiguration config) {
_log = log;
_config = config;
}
public async Task StartAsync(CancellationToken cancellationToken) {
// update entities
AlphaRepository.ProcessEntities(_config, alphaEntities);
}
}
public interface IService {
public void Run(string arg, IEnumerable<Entity> alphaEntities);
}
问题是应用程序永远不会结束,即使服务结束了它的工作。有没有一种方法可以"杀死"?工作完成后的申请?
当服务结束时,你需要关闭服务,你需要使用一个服务控制器来检查服务状态,并在服务状态关闭时关闭应用。
ServiceController类
这个答案可能有帮助
使用c# [duplicate]启动和停止服务
注意,在有多个线程或运行服务的应用程序中,必须调用
Environment.Exit(0);
结束应用程序来结束应用程序,否则它将在后台等待来自服务或线程的事件。