【发布时间】:2014-09-19 08:55:15
【问题描述】:
我编写了一个 Windows 服务项目,该项目托管一个长时间运行的消息泵任务,该任务旨在在服务期间运行。当服务启动时,它会启动任务。当服务停止时,它会停止任务:
void OnStart()
{
MessagePump.Start();
}
void OnStop()
{
MessagePump.Stop();
}
MessagePump.Start 执行 Task.Factory.StartNew,MessagePump.Stop 指示任务停止并执行 Wait()。
到目前为止一切都很好,但我想知道如何最好地处理错误。如果任务有未处理的异常,我希望服务停止,但由于通常没有等待任务,我想它只会坐在那里什么都不做。我该如何优雅地处理这种情况?
更新:
共识似乎是使用'await'或ContinueWith。以下是我目前编写 Start 方法以使用它的方式:
public async static void Start()
{
this.state = MessagePumpState.Running;
this.task = Task.Factory.StartNew(() => this.ProcessLoop(), TaskCreationOptions.LongRunning);
try
{
await this.task;
}
catch
{
this.state = MessagePumpState.Faulted;
throw;
}
}
【问题讨论】:
-
我建议您使用带有取消选项的 async/await。当您有未处理的异常时,请取消,您的程序将知道错误
-
我可以在 Windows 服务中执行此操作吗?我的理解是,如果我在 OnStart() 中进行等待,那么在任务完成之前它不会退出? (可能是错的)
-
嗯。不等待 MessagePump.Start() 上的 Task 怎么样?检查这个博客,也许你会找到你要找的东西。 blog.stephencleary.com
标签: c# windows-services task-parallel-library