gpt4 book ai didi

c# - AsyncContext -> AsyncContextThread 处理异常

转载 作者:行者123 更新时间:2023-12-02 19:43:53 27 4
gpt4 key购买 nike

关于:AsyncContextThread

https://github.com/StephenCleary/AsyncEx/wiki/AsyncContext

https://github.com/StephenCleary/AsyncEx/blob/master/src/Nito.AsyncEx.Context/AsyncContextThread.cs

它并没有真正涵盖如何处理捕获线程启动时发生的异常。

public partial class MyService : ServiceBase
{
private readonly AsyncContextThread _thread = new AsyncContextThread();

private readonly CancellationTokenSource _cts = new CancellationTokenSource();

public MyService()
{
InitializeComponent();
}

public void Start()
{
OnStart(null);
}

protected override void OnStart(string[] args)
{
try
{
_thread.Factory.Run(StartAsync);
}
catch (Exception ex)
{
// Exception?
}
}

private async Task StartAsync()
{
throw new Exception("things went wrong");
}

protected override void OnStop()
{
if (!_cts.IsCancellationRequested)
_cts.Cancel();
_thread.JoinAsync().GetAwaiter().GetResult();
}
}

我似乎没有在 catch{} block 中捕获任何内容,此外我尝试将它们添加到我的 Program.cs(主入口点)中。

TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

但是,上面的代码中没有触发事件处理程序方法。

问)在这种情况下如何正确处理异常?

顺便说一句,我相当确定之前使用 AsyncContext 并在 Visual Studio 中进行调试确实捕获了异常,因此我不确定是否存在一些同步。当尝试添加异常处理程序时,我缺少上下文。

编辑

我知道我可以在 StartAsync 方法中try/catch,但我要表达的重点是能够捕获任何未处理的异常并确保我可以记录它们。

最佳答案

几年来我一直想写一篇关于异步 Win32 服务的博客文章...:)

It's not really covered how to handle catching exceptions that occur when the thread is started.

AsyncContextThread 实际上在创建后立即启动。您在 OnStart 上所做的是将工作排队到其上下文中。

在从 Run 返回的 Task 上观察到该工作的异常,观察它的适当方法是使用 await:

protected override async void OnStart(string[] args)
{
try
{
await _thread.Factory.Run(StartAsync);
}
catch (Exception ex)
{
// Exception!
}
}

一些注意事项:

通常情况下,您应该avoid async void 。该规则的异常(exception)是事件处理程序或类似事件的方法(例如 OnStart)。当您确实使用async void时,您应该考虑在整个async周围使用try/catch void 方法体(我们这样做)。

await is superior to ContinueWith 。在这种特殊情况下,ContinueWith 可以正常工作,但在一般情况下,这是不可取的:它不理解 async 委托(delegate),它不使用适当的默认 TaskScheduler,并且它不使用适当的默认延续标志。这些都是 await 为您处理的事情。

关于c# - AsyncContext -> AsyncContextThread 处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46491274/

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