C# 如何在运行任务时捕获windows服务中的异常?

C# 如何在运行任务时捕获windows服务中的异常?,c#,async-await,windows-services,C#,Async Await,Windows Services,windows服务并非100%可靠,我有以下几点: protected override void OnStart(string[] args) { _myManager.Start(); } 在MyManager中: public void Start() { _myTask = Task.Run(DoStuff); } 理论上,OnStart方法将返回,服务将成功启动async Task DoStuff()只是一个无限循环(如果服务停止,它将退出) 我想给这个添加try/

windows服务并非100%可靠,我有以下几点:

protected override void OnStart(string[] args)
{
    _myManager.Start();
}
在MyManager中:

public void Start()
{
    _myTask = Task.Run(DoStuff);
}
理论上,OnStart方法将返回,服务将成功启动
async Task DoStuff()
只是一个无限循环(如果服务停止,它将退出)

我想给这个添加try/catch。理想情况下,它应该在OnStart方法中,这样我就可以调用
this.Stop()
来停止服务(因为它将是
ServiceBase
)。这是为了捕获我没有显式处理的任何异常,以便记录它们并关闭服务

我可以简单地围绕
\u myManager.Start()包装一个try catch吗?或者我需要做一些涉及任务的聪明的事情吗?

您需要使用“ContinueWith”,并定义一个错误处理函数,该函数可能会将错误记录到Windows事件日志中,并停止服务

您不想在OnStart()中等待/阻止,因为Windows希望它能快速返回(如果不能及时启动,它将报告错误)


更多讨论请参见此处:

async void Start()
,然后
尝试{wait Task.Run(DoStuff);}catch{…}
我不知道
async void
是合法的,我认为它必须是
async Task
!有趣的我也不知道它是做什么的…是时候阅读一下
async/await
async void
是不被鼓励的,主要是出于好的理由,但它很适合你的问题。我的问题是理解程序的流程,如果你等待某个东西,那么它会等到任务完成后再执行下一行,但在windows服务中,出于某种原因,它将返回方法并允许服务启动。这真让我感到不可思议。我能不能在myManager.Start()周围放置一个try catch?可能不对,因为这会产生一个单独的任务。这就是问题所在&我真的不知道该怎么办。async/await示例似乎没有谈到这一点,因为我在asp.net中使用async/await已有多年,没有出现任何问题,但这是新的,当控制台应用程序中的主方法返回时,应用程序关闭。当服务中的OnStart返回时,该服务将继续运行。这取决于控制台应用程序/服务通常是如何工作的,使用
ContinueWith
和其他类似的传统TPL API越少越好。我们现在处于异步/等待时代!