gpt4 book ai didi

c# - .NET 通用主机 : Prevent application crash on unhandled exception

转载 作者:行者123 更新时间:2023-11-30 16:40:03 24 4
gpt4 key购买 nike

我有一个带有 IHostedService 的 .NET 通用主机,它从 OPC-UA 接口(interface)接收事件并处理它们。

问题是如果在处理一个事件的过程中出现未处理的异常,整个应用就会崩溃

我阅读了文档,但没有找到任何有关全局异常处理程序或允许捕获未处理异常并防止应用程序崩溃的类似机制的信息。

是否有保护通用主机以及 IHostedService 免受未处理异常的解决方案?

编辑

我知道,这里最简单的事情是尝试/捕获异常并且不让它冒泡。但我想知道是否有类似 WinForms/WPF 的机制,您可以在其中更全局地捕获此类异常并防止崩溃。

编辑

这是代码的简化版本:

public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}

public static IHostBuilder CreateHostBuilder(string[] args)
{
var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
return new HostBuilder()
.UseEnvironment(environmentName)
.ConfigureLogging((hostContext, logging) =>
{
...
})
.ConfigureAppConfiguration((hostContext, builder) =>
{
builder
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", true, true)
.AddJsonFile($"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json", true, true)
.AddEnvironmentVariables();
})
.ConfigureServices((hostContext, services) =>
{
services.AddSingleton<IHostedService, OpcClientHostedService>();
...
});
}
}

public class OpcClientHostedService : IHostedService
{
private readonly OpcConfiguration _opcConfiguration;
private readonly ILogger _logger;
private readonly OpcClient _opcClient;

public OpcClientHostedService(OpcConfiguration opcConfiguration, ILogger<OpcClientHostedService> logger)
{
_opcConfiguration = opcConfiguration;
_logger = logger;
_opcClient = new OpcClient(opcConfiguration.ServerUri);
}

public Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Connecting to OPC server with URI '{0}'", _opcConfiguration.ServerUri);
try
{
_opcClient.Connect();
}
catch (Exception ex)
{
_logger.LogCritical(ex, "Cannot connect to OPC server");
throw;
}
_logger.LogInformation("Connection to OPC server is successful");

CreateOpcObservable().Subscribe(async args => await ProcessOpcEvent(args));

return Task.CompletedTask;
}

private async Task ProcessOpcEvent(OpcValueChangedEventArgs args)
{
await MethodThatCanThrowAnException(args); // If the exception is not handled, the whole application crashes!
}

public Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Disconnecting to OPC server");
_opcClient.Disconnect();
_logger.LogInformation("Disconnection to OPC server is successful");
return Task.CompletedTask;
}

...
}

在此示例中,很容易在 ProcessOpcEvent 方法中添加一个 try/catch block ,但如果有一种机制可以避免在这种情况下应用程序完全崩溃,那就太好了。

最佳答案

您可以添加应用域级别的事件处理程序,但您将无法控制以任何特定方式继续执行。为了能够控制执行及其处理异常的方式,您必须在处理 OPC 有效负载消息时实现 try/catch 语句。

关于c# - .NET 通用主机 : Prevent application crash on unhandled exception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52081820/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com