一旦程序存在于 c# .net 核心中,端口就不会被释放

Port not freed as soon as program exist in c# .net core

我有一个用作 REST Web 服务器的 C# .net core 3.1 控制台应用程序。它作为 Windows 服务运行。它运行良好,但在我关闭应用程序(或它因某些操作而崩溃)后,我无法立即启动应用程序。我收到以下错误,

Unable to start Kestrel. System.IO.IOException: Failed to bind to address http://[::]:8000: address already in use.

---> Microsoft.AspNetCore.Connections.AddressInUseException: Only one usage of each socket address(protocol/network/address/port) is normally permitted.

--->System.Net.Sockets.SocketException(10048): Only one usage of each socket address(protocol/network/address/port) is normally permitted.
.
.
.

如果我在大约 5 分钟后尝试,我可以启动应用程序。在我进入应用程序之前,我应该做些什么或者我可以做些什么来释放端口上的绑定?

#更新 - 1 我使用以下命令在错误等情况下关闭应用程序,

_hostLifetime.StopApplication();

这是初始化网络服务器的代码,

webBuilder.UseStartup<Startup>().UseUrls(restPort.Value);

Startupclass的构造函数如下,

_httpListener = new HttpListener();

Startupclass中的Configure方法有如下代码,

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

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }

当您关闭 NetCore 应用程序时,它不会调用代码来终止 运行 服务。它只是终止,这意味着不会调用代码来关闭连接。您需要确保打开端口的任何代码都包含在 using 中,以便它可以正确处理。在 Windows 服务中,应该有一个 OnStop 方法,您需要处理该方法并显式关闭连接。

https://docs.microsoft.com/en-us/dotnet/api/system.serviceprocess.servicebase.onstop?view=dotnet-plat-ext-6.0

如果问题仍然存在,我发现解决它的唯一方法是重启我的机器