關於: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