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();
}
};
谢谢!
我正在创建几个 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();
}
};
谢谢!