C# 在ASP.Net Core 2.0中,当Kestrel因任何原因停止时进行预成型清理

C# 在ASP.Net Core 2.0中,当Kestrel因任何原因停止时进行预成型清理,c#,asp.net-core,asp.net-core-mvc,asp.net-core-2.0,C#,Asp.net Core,Asp.net Core Mvc,Asp.net Core 2.0,我正在开发一个web应用程序,它运行多个线程,这些线程处理套接字和文件I/O。因此,如果应用程序关闭,我首先要完成这些线程并清理它们 我已经找到了下面的代码,它在正常关机的情况下非常有效 public class Startup { public void Configure(IApplicationBuilder app, IApplicationLifetime applicationLifetime) { applicationLifetime.Appl

我正在开发一个web应用程序,它运行多个线程,这些线程处理套接字和文件I/O。因此,如果应用程序关闭,我首先要完成这些线程并清理它们

我已经找到了下面的代码,它在正常关机的情况下非常有效

public class Startup 
{
    public void Configure(IApplicationBuilder app, IApplicationLifetime applicationLifetime) 
    {
        applicationLifetime.ApplicationStopping.Register(OnShutdown);
    }

    private void OnShutdown()
    {
         // Do your cleanup here
    }
}
但是,当发生不正常关机时,不会调用OnShutDown()方法

在表单中,您可以使用以下代码检测各种关机原因:

private void Form1_FormClosing(object sender, FormClosingEventArgs e)  
{  
    switch (e.CloseReason)  
    {  
        case CloseReason.ApplicationExitCall:  
            // The Exit method of the Application class was called.  
            break;  
        case CloseReason.FormOwnerClosing:  
            // The owner form is closing.  
            break;  
        case CloseReason.MdiFormClosing:  
            // The parent form is closing.  
            break;  
        case CloseReason.None:  
            // Unknown closing reason.  
            break;  
        case CloseReason.TaskManagerClosing:  
            // The application is being closed from the TaskManager.  
            break;  
        case CloseReason.UserClosing:  
            // The user is closing the form through the UI.  
            break;  
        case CloseReason.WindowsShutDown:  
            // Windows is closing the application because it is shutting down.  
            break;  
    }  
} 

在ASP.Net Core 2.0中是否有类似的东西可以在正常关机状态下检测任何类型的关机?

事件处理以成功退出为前提。如果您执行了诸如硬重启或应用程序崩溃之类的操作,就没有机会处理任何事情,因为它已经不存在了。这就是重点:它被迫退出,所以它什么也做不了

也就是说,这里的问题不是实际问题,也不是设计问题。首先,如果进程退出,线程也会随之退出。没有什么需要“清理”的。套接字句柄和类似的东西只是内存中的指针,它们也与进程一起工作

如果这个过程悬而未决,那就不同了。在这种情况下,它可以保留资源,因为它在技术上仍然在运行。然而,真正的问题是修复导致进程挂起的任何东西,而不是弄清楚在挂起时如何释放资源


请记住,web服务器是为快速响应传入请求而设计的。这应该是一个几乎瞬间的过程。它的设计不是为了在一段时间内仔细考虑请求,做一大堆工作。如果您需要执行诸如连接到套接字之类的操作,那么这些操作很可能会被卸载到外部进程中,如控制台应用程序、windows服务等。然后,您的web应用程序可以简单地将工作交给该进程并继续进行。您可以提供一个端点来检查状态、进度等,并通过signar或AJAX长轮询使用该端点来更新客户机的工作进度/在工作完成时通知客户机。

事件处理取决于成功退出。如果您执行了诸如硬重启或应用程序崩溃之类的操作,就没有机会处理任何事情,因为它已经不存在了。这就是重点:它被迫退出,所以它什么也做不了

也就是说,这里的问题不是实际问题,也不是设计问题。首先,如果进程退出,线程也会随之退出。没有什么需要“清理”的。套接字句柄和类似的东西只是内存中的指针,它们也与进程一起工作

如果这个过程悬而未决,那就不同了。在这种情况下,它可以保留资源,因为它在技术上仍然在运行。然而,真正的问题是修复导致进程挂起的任何东西,而不是弄清楚在挂起时如何释放资源


请记住,web服务器是为快速响应传入请求而设计的。这应该是一个几乎瞬间的过程。它的设计不是为了在一段时间内仔细考虑请求,做一大堆工作。如果您需要执行诸如连接到套接字之类的操作,那么这些操作很可能会被卸载到外部进程中,如控制台应用程序、windows服务等。然后,您的web应用程序可以简单地将工作交给该进程并继续进行。您可以提供一个端点来检查状态、进度等,并通过signar或AJAX长轮询来更新客户端的工作进度/在工作完成时通知客户端。

即使在WinForms中,如果应用程序崩溃,
FormClosing
事件也不会运行。任何关键事件都不要依赖此事件。即使在WinForms中,如果应用程序崩溃,
FormClosing
事件也不会运行。不要依赖此事件处理任何关键事件。什么可能会导致Kestrel服务器正常关闭?我认为在我的一生中,没有一个网站会优雅地关闭我。优雅的关闭是指在实际请求关闭时,而不是由于崩溃或强制重新启动服务器等原因。你是对的,通常情况下,关闭的不仅仅是一个运行正常的应用程序,因此,这些类型的停机显然很罕见。它们非常罕见,我甚至不知道如何启动。你是否需要在你的应用程序中手动构建关机功能,或者有没有一种方法可以让你优雅地停止kestrel站点?@Jay你可以在kestrel控制台窗口中点击Ctrl-C。但是,是的,我同意,我只会在特殊情况下这样做,我需要对服务器本身进行维护。什么可能会导致Kestrel服务器正常关闭?我认为在我的一生中,没有一个网站会优雅地关闭我。优雅的关闭是指在实际请求关闭时,而不是由于崩溃或强制重新启动服务器等原因。你是对的,通常情况下,关闭的不仅仅是一个运行正常的应用程序,因此,这些类型的停机显然很罕见。它们非常罕见,我甚至不知道如何启动。你是否需要在你的应用程序中手动构建关机功能,或者有没有一种方法可以让你优雅地停止kestrel站点?@Jay你可以在kestrel控制台窗口中点击Ctrl-C。但是,是的,我同意,我只会在特殊情况下这样做,我需要对服务器本身进行维护。