: 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();
}
}
나는뿐만 아니라 내 Program.cs (주 진입 점)에 다음을 추가하는 시도는 catch{}
블록에서 아무것도 잡을 것 같지 않습니다.
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
그러나 위의 코드에서 이벤트 처리기 메서드가 트리거되지 않습니다.
Q)이 상황에서 어떻게 예외를 올바르게 처리합니까?
부수적으로 이전에 AsyncContext
을 사용하고 Visual Studio에서 디버깅을하면 예외가 발생했기 때문에 동기화가 있는지 확실하지 않습니다. 문맥 나는 예외 처리기를 추가하려고 할 때 실종되었다.
편집
나는 내가 StartAsync
메소드 내 try/catch
을 할 수있는 알고,하지만 난에 받고 있어요 지점은 처리되지 않은 예외를 잡아 내가 그들을 로그인 할 수 있는지 확인 할 수있는 것입니다.
나는이 질문에 대한 Stephen Cleary의 대답을 필사적으로 바라보고있다. – peteski
예외를 잡으려고'try'에서 메소드를'기다려야한다고 생각한다. 현재 비동기 메서드는 호출자에게 즉시 반환되며 throw 된 오류는 손실됩니다. – Equalsk
@Equalsk Windows 서비스의'OnStart' 메소드에서 무엇이든 '대기'할 수 없습니다. 오버라이드이며 예상되는 서명과 일치해야합니다. AsyncContext/AsyncContextThread (내가 이해하는 한)의 전체 아이디어는 허용하지 않는 곳 (예 : 콘솔 앱 또는 Windows 서비스)에서 비동기 메소드를 스핀 업하도록 허용하는 것입니다. – peteski