c# wpf 如何捕获 FirestoreChangeListener 异常

c# wpf How to catch FirestoreChangeListener exceptions

我正在创建几个 FirestoreChangeListeners(遵循 https://googleapis.github.io/google-cloud-dotnet/docs/Google.Cloud.Firestore/userguide.html 处的用户指南)并且一切正常,但是当出现网络问题时,System.AggregateException 被抛出,内部异常是 Grpc.Core.RpcException,状态为“传输已关闭”或“无法连接”(这是有道理的)。

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

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

文档说 Listen 方法是一种“方便”的方法,据称可以帮助 监视 Listener...并且它确实包含一个 returns 的 ListenerTask 方法一个任务。也许我需要对这些任务做点什么……我读过的所有建议我都应该等待这个,但是因为它是一个异步监听器,在程序运行的整个过程中一直在后台运行 运行,我不是确定应该等待什么方法...不会等待阻止整个方法吗?

我的代码是:

  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);
      }
    }

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

亲切的问候, 达米安

根据 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();
    }
};

谢谢!