0

我正在创建几个FirestoreChangeListeners(遵循https://googleapis.github.io/google-cloud-dotnet/docs/Google.Cloud.Firestore/userguide.html上的用户指南)并且一切正常,但是当有网络问题,抛出 System.AggregateException,内部异常是 Grpc.Core.RpcException,状态为“Transport Closed”或“Failed to connect”(这是有道理的)。

问题是我不知道如何捕获或处理这些由 FirestoreChangeListeners 抛出的内部异常,或者我应该如何构造方法才能做到这一点。

我尝试在多个地方添加 try/catch,尝试将 ContinueWith 添加到侦听器,但无论如何我仍然得到未处理的 System.AggregateException。

在此处输入图像描述

文档说 Listen 方法是一种“方便”的方法,据说有助于监视 Listener ......它确实包括一个返回 Task 的 ListenerTask 方法。也许我需要对这些任务做些什么......我读过的所有建议我应该等待这个,但由于它是一个异步监听器,在程序运行的整个过程中都在后台运行,我不确定应该使用什么方法等待...不会等待阻止整个方法吗?

FirestoreChangeListener 监听方法

我的代码是:

  public void Connect()
    {
      // Authentication code...
    
      if (authenticated) CreateFirestoreChangeListeners();
    }
    
    public void CreateFirestoreChangeListeners()
    {
      foreach (var docRef in documentReferences.Values)
      {
        FirestoreChangeListener listener = docRef.Listen(querySnapshot =>
        {
          try
          {
            ProcessSnapshot(querySnapshot);
          }
          catch (Exception ex)
          {
            Debug.WriteLine("FirestoreChangeListener: " + ex);
          }
        });
    
        listener.ListenerTask.ContinueWith((task) =>
        {
          Console.WriteLine("Task faulted");
          var ae = task.Exception;
          if (ae != null)
          {
            ae.Flatten().Handle(ex =>
            {
              Console.WriteLine("Exception Handled");
              return true;
            });
          }
        });
    
        firestoreChangeListeners.Add(listener);
      }
    }

非常感谢任何人都可以提供的任何帮助!

亲切的问候,达米安

4

1 回答 1

2

根据 Jon 在https://github.com/googleapis/google-cloud-dotnet/issues/5462的调查,底层 gRPC 代码中存在错误。

Jon 建议的解决方法也可以正常工作,并且可以很好地解决此问题:

TaskScheduler.UnobservedTaskException += (sender, args) =>
{
    if (args.Exception is AggregateException && args.Exception.InnerException is RpcException)
    {
        args.SetObserved();
    }
};

谢谢!

于 2020-10-23T03:47:27.320 回答