代码之家  ›  专栏  ›  技术社区  ›  Kagemand Andersen

C区内抛接球#

  •  3
  • Kagemand Andersen  · 技术社区  · 6 年前

    昨天发现的一些东西让我意识到我很可能仍然错过了关于C_的基本小道消息。

    我有一个无状态的服务结构应用程序。我在主while循环附近有一个尝试捕捉。如果我在这个循环中抛出一个异常,它将脱离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;
            }
        }
    

    有人能解释一下这是为什么吗?或者告诉我在哪里可以得到答案?我找不到任何能解释这种行为的东西。

    编辑:它不是 Is there a difference between "throw" and "throw ex"? 因为,就我所见,没有对我的问题的解释,为什么这个函数会再次运行。这个话题更多的是解释 throw new 各自的堆栈跟踪。

    1 回复  |  直到 6 年前
        1
  •  5
  •   Zdeněk Jelínek    6 年前

    根据您的描述,我们有两种选择:

    1. 你重新抛出异常和 RunAsync Task 因为那个异常而失败
    2. 你不会再重复异常和 运行异步 任务 正常完成(捕获的异常打破了 while 循环,因此方法退出)。

    对于第一个案例, Service Fabric Stateless Service RunAsync doc 进一步详细说明遇到异常时的行为,即从 FabricException 将导致重新启动,而其他服务可能会被有意或意外终止并导致其停止。

    正常完成在逻辑上意味着服务已成功完成执行,并将根据 Service Fabric Reliable Services Lifecycle doc .