ASP.NET 关闭程序服务器

在开发和维护ASP.NET应用程序时,有时候需要实现关闭程序服务器的功能,这通常涉及到对进程的管理、服务的停止以及资源的释放,本文将详细介绍如何在ASP.NET中关闭程序服务器,包括相关代码示例和注意事项。
一、
关闭程序服务器通常涉及以下几个步骤:
1、检测关闭请求:应用程序需要能够检测到关闭请求,这可能是通过用户界面按钮点击、API调用或其他方式触发的。
2、执行清理操作:在关闭之前,应用程序可能需要执行一些清理操作,比如关闭数据库连接、释放资源等。
3、停止服务或进程:根据应用程序的具体实现,可能需要停止相关的服务或进程。
4、释放资源并退出:应用程序需要释放所有剩余的资源并安全退出。
二、实现方法
1. 使用IHostedService接口

在ASP.NET Core中,可以使用IHostedService接口来实现后台服务,这些服务可以在应用程序启动时启动,并在应用程序关闭时停止。
public class SampleHostedService : IHostedService, IDisposable
{
private readonly Timer _timer;
private Task _taskExecution;
public SampleHostedService()
{
_timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));
}
public Task StartAsync(CancellationToken cancellationToken)
{
_taskExecution = Task.Run(() => DoWork(null), cancellationToken);
return Task.CompletedTask;
}
private void DoWork(object state)
{
// 执行定时任务
}
public Task StopAsync(CancellationToken cancellationToken)
{
_timer?.Change(Timeout.Infinite, 0); // 停止计时器
_taskExecution?.Wait(); // 等待任务完成
_taskExecution = null;
return Task.CompletedTask;
}
public void Dispose()
{
_timer?.Dispose();
}
}
在Program.cs中注册这个服务:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.ConfigureServices(services =>
{
services.AddHostedService<SampleHostedService>();
});
}
2. 使用ApplicationLifetime接口
ApplicationLifetime接口提供了一种在应用程序生命周期事件(如启动和停止)期间执行代码的方式。
public class ApplicationLifetimeEventsHostedService : IHostedService
{
private readonly IHostApplicationLifetime _hostApplicationLifetime;
public ApplicationLifetimeEventsHostedService(IHostApplicationLifetime hostApplicationLifetime)
=> _hostApplicationLifetime = hostApplicationLifetime;
public Task StartAsync(CancellationToken cancellationToken)
{
_hostApplicationLifetime.ApplicationStarted.Register(OnStarted);
_hostApplicationLifetime.ApplicationStopping.Register(OnStopping);
_hostApplicationLifetime.ApplicationStopped.Register(OnStopped);
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
private void OnStarted() => Console.WriteLine("Application started");
private void OnStopping() => Console.WriteLine("Application stopping");
private void OnStopped() => Console.WriteLine("Application stopped");
}
在Program.cs中注册这个服务:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.ConfigureServices(services =>
{
services.AddHostedService<ApplicationLifetimeEventsHostedService>();
});
}
3. 手动控制进程关闭
在某些情况下,可能需要手动控制进程的关闭,通过一个特定的文件或数据库记录来指示应用程序关闭。

// 示例:通过读取文件内容来控制进程关闭
using System;
using System.IO;
using System.Diagnostics;
using System.Threading;
using Microsoft.Win32;
using System.Windows.Forms;
namespace CHED
{
static class Program
{
[STAThread]
static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new Restart_Serv_U()
};
ServiceBase.Run(ServicesToRun);
}
}
public partial class Restart_Serv_U : ServiceBase
{
public Restart_Serv_U()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
Thread CHEDThread = new Thread(ServerStart);
CHEDThread.Start();
}
protected override void OnStop() { }
private void ServerStart()
{
CHED LCYSC = new CHED();
Application.Run(LCYSC);
}
}
}
在CHED类中,定期检查文件内容,并根据内容执行相应的操作:
using System;
using System.Threading;
using Microsoft.Win32;
using System.IO;
using System.Diagnostics;
using System.Windows.Forms;
using System.ComponentModel;
using System.Data;
using System.ServiceProcess;
using System.Text;
using System.Collections.Generic;
using System.Linq;
namespace CHED
{
public partial class CHED : ApplicationContext
{
private System.Threading.Timer watcher;
public CHED()
{
watcher = new System.Threading.Timer(new TimerCallback(watcherCallBack), null, 1000, 1000); // 每秒检查一次文件内容
}
private void watcherCallBack(object o)
{
try
{
string text = File.ReadAllText(@"D:/webroot/CEDC/Manage/Admin/CHED/reset.ched"); // 读取文件内容
if (text == "restart") // 如果文件内容为"restart",则重启进程
{
System.Diagnostics.Process[] pros = System.Diagnostics.Process.GetProcessesByName("Serv-U"); // 获取指定名称的进程列表
if (pros.Length > 0) pros[0].Kill(); // 如果有进程在运行,则杀死该进程
File.WriteAllText(@"D:/webroot/CEDC/Manage/Admin/CHED/reset.ched", "wait"); // 将文件内容重置为"wait"
}
}
catch { }
}
}
}
在网页的按钮事件中,将文件内容设置为"restart"以触发进程重启:
protected void ButtonRestart_Click(object sender, EventArgs e)
{
File.WriteAllText(@"D:/webroot/CEDC/Manage/Admin/CHED/reset.ched", "restart"); // 设置文件内容为"restart"以触发进程重启
}
1、确保资源正确释放:在关闭应用程序之前,确保所有打开的资源(如文件句柄、数据库连接等)都已正确释放。
2、处理异常:在关闭过程中可能会抛出异常,应适当处理这些异常以避免应用程序崩溃。
3、通知用户:如果可能的话,在关闭应用程序之前通知用户即将发生的关闭操作,这可以通过弹出对话框或在用户界面上显示消息来实现。
小伙伴们,上文介绍了“asp.net 关闭程序服务器”的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。