昨天找到的东西让我意识到我很可能仍然缺少关于C#的基本花絮.
我有一个无状态服务结构应用程序.我在主循环中有一个尝试捕获.如果我在这个循环中抛出一个异常,它会跳出while循环并且服务有效地停止.如果我throw
向catch子句添加一个,则服务将重新启动.
protected override async Task RunAsync(CancellationToken cancellationToken)
{
try
{
long iterations = 0;
while (true)
{
cancellationToken.ThrowIfCancellationRequested();
await Task.Delay(TimeSpan.FromSeconds(3), cancellationToken).ConfigureAwait(false);
// Do stuff...
if (iterations > 4) {
throw new Exception();
}
ServiceEventSource.Current.ServiceMessage(this.Context, $"Working-{++iterations}");
}
}
catch (Exception ex)
{
// Log stuff...
throw;
}
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么这是或指示我到哪里可以得到答案?我找不到任何可以解释这种行为的东西.
编辑:这不是重复是什么"投掷"和"投掷前"之间有什么区别?因为,据我所见,它没有解释我的问题,为什么函数再次运行.该主题更多的是解释之间的区别throw
和throw new
各自的堆栈跟踪.
根据您的描述,我们有两种选择:
RunAsync
Task
失败RunAsync
Task
正常完成(捕获的异常打破了while
循环,因此方法退出).对于第一种情况,Service Fabric无状态服务RunAsync文档进一步详细说明了遇到异常时的行为,即派生的异常FabricException
将导致重新启动,而其他异常是意图或意外的服务中止并导致其停止.
优雅的完成在逻辑上意味着服务已成功完成执行,并将根据Service Fabric Reliable Services Lifecycle doc关闭.