当 Kestrel 在 ASP.Net Core 2.0 中因任何原因停止时进行预成型清理
Preform cleanup when Kestrel is stopped for any reason in ASP.Net Core 2.0
我正在开发一个具有多个线程 运行 的 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() 方法。
在 Forms 中,您可以使用以下代码检测各种关机原因:
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 中是否有类似的东西来检测任何类型的关机,仅显示正常关机的统计信息?
事件处理以成功退出为前提。如果您执行硬重启或应用程序崩溃之类的操作,则没有机会处理任何事情,因为它已经消失了。这就是重点:它被迫退出,所以它什么也做不了。
也就是说,这里的问题要么不是实际问题,要么是设计问题。首先,如果进程退出,线程也会随之退出。 "cleanup"没什么。套接字句柄等只是内存中的指针,它们也随进程一起移动。
如果进程挂起,那就另当别论了。在那种情况下,它可以保留资源,因为它在技术上仍然是 运行。然而,真正的问题是解决导致进程挂起的任何问题,而不是弄清楚挂起时如何释放资源。
请记住,网络服务器旨在快速响应传入请求。这应该是一个几乎瞬时的过程。它的设计目的不是为了暂时处理请求,做一堆工作。如果您需要执行诸如连接到套接字之类的操作,则很可能会将其卸载到外部进程中,例如控制台应用程序、windows 服务等。然后,您的 Web 应用程序可以简单地将工作交给它继续前进。您可以提供一个端点来检查状态、进度等,并通过 SignalR 或 AJAX 长轮询使用它来更新客户端 work/notify 它们的进度。
我正在开发一个具有多个线程 运行 的 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() 方法。
在 Forms 中,您可以使用以下代码检测各种关机原因:
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 中是否有类似的东西来检测任何类型的关机,仅显示正常关机的统计信息?
事件处理以成功退出为前提。如果您执行硬重启或应用程序崩溃之类的操作,则没有机会处理任何事情,因为它已经消失了。这就是重点:它被迫退出,所以它什么也做不了。
也就是说,这里的问题要么不是实际问题,要么是设计问题。首先,如果进程退出,线程也会随之退出。 "cleanup"没什么。套接字句柄等只是内存中的指针,它们也随进程一起移动。
如果进程挂起,那就另当别论了。在那种情况下,它可以保留资源,因为它在技术上仍然是 运行。然而,真正的问题是解决导致进程挂起的任何问题,而不是弄清楚挂起时如何释放资源。
请记住,网络服务器旨在快速响应传入请求。这应该是一个几乎瞬时的过程。它的设计目的不是为了暂时处理请求,做一堆工作。如果您需要执行诸如连接到套接字之类的操作,则很可能会将其卸载到外部进程中,例如控制台应用程序、windows 服务等。然后,您的 Web 应用程序可以简单地将工作交给它继续前进。您可以提供一个端点来检查状态、进度等,并通过 SignalR 或 AJAX 长轮询使用它来更新客户端 work/notify 它们的进度。