- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
关于: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/
关于:AsyncContextThread https://github.com/StephenCleary/AsyncEx/wiki/AsyncContext https://github.com/
我是一名优秀的程序员,十分优秀!