微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c#wpf如何捕获FirestoreChangeListener异常

如何解决c#wpf如何捕获FirestoreChangeListener异常

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

问题是我无法弄清楚如何捕获或处理这些由Firestorechangelistener引发的内部异常,或者我应该如何构造该方法以实现此目的。

我尝试在多个位置添加try / catch,尝试将ContinueWith添加到侦听器,但是无论我还是遇到未处理的System.AggregateException。

enter image description here

文档中说,Listen方法一个“便捷”方法,据称​​有助于监视监听器...并且它确实包含一个返回Task的ListenerTask方法。也许我需要对这些任务做些...我已经阅读了所有建议,我应该等待,但是由于它是一个异步侦听器,在程序运行的整个过程中都在后台运行,因此我不确定应该使用哪种方法等待...不会等待整个方法吗?

FirestoreChangeListener Listen Method

我的代码是:

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

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

亲切的问候, 达米安

解决方法

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

谢谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。