关于:AsyncContextThread
AsyncContext - > 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{}
块东西,除了我尝试添加这些对我的Program.cs(主入口点)。
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
但是在上面的代码中没有触发事件处理程序方法。
Q)在这种情况下你如何正确处理异常?
作为一个方面说明,我相当确定以前使用AsyncContext
并在Visual Studio中进行调试确实发现了异常,所以我不确定是否有某种同步。上下文我很想念,当试图添加异常处理程序。
编辑
我知道我可以在StartAsync
方法中try/catch
,但我在获得关键是能够捕捉任何未处理的异常,并确保我可以登录他们。
我拼命希望斯蒂芬Cleary回答这个问题:) – peteski
我认为你需要'等待''try'中的方法来捕获异常。目前异步方法将立即返回给调用者,抛出的错误将丢失。 – Equalsk
@Equalsk你不能在Windows服务的OnStart方法中“等待”任何东西,因为它是一个覆盖,并且必须匹配预期的签名。 AsyncContext/AsyncContextThread的整个想法(据我所知)是允许你从不允许的地方启动异步方法(即控制台应用程序或Windows服务)。 – peteski