C# &引用;当前错误上下文错误与请求的错误不同;Json.Net中的异常 上下文
我用C#编写了一个并行作业框架,从ElasticSearch集群导入/导出大量数据。为此,我将单个项的每个导入或导出建模为一个对象,该对象在某个点由框架执行。为了与ElasticSearch接口,我使用了NEST(官方的.NETElasticSearch客户端库)v1.7.1和JSON.NET7.0.1 每个导入/导出任务对象都使用嵌套与ElasticSearch交互。出于性能原因,我编写了一个代理类,它将任务对象生成的搜索请求分组到固定大小的批中,以便与NEST的_msearchAPI一起使用。此类的调用程序将延迟,直到其批处理返回 我的框架将每个导入/导出任务的结果包装为“bool”或“Exception”。即使遇到个别项目的错误,整个过程也能够继续 问题 在几个小时无误地完成任务后,我发现以下异常出现了数千次:C# &引用;当前错误上下文错误与请求的错误不同;Json.Net中的异常 上下文,c#,multithreading,json.net,nest,
elasticsearch-net,C#,Multithreading,Json.net,Nest,
elasticsearch Net,我用C#编写了一个并行作业框架,从ElasticSearch集群导入/导出大量数据。为此,我将单个项的每个导入或导出建模为一个对象,该对象在某个点由框架执行。为了与ElasticSearch接口,我使用了NEST(官方的.NETElasticSearch客户端库)v1.7.1和JSON.NET7.0.1 每个导入/导出任务对象都使用嵌套与ElasticSearch交互。出于性能原因,我编写了一个代理类,它将任务对象生成的搜索请求分组到固定大小的批中,以便与NEST的_msearchAPI一起使用
System.InvalidOperationException: Current error context error is different to requested error.
at _____.Matcher.<GetBestMatchAsync>d__15.MoveNext() in C:\\_work\\edc7a363\\_____\\Matcher.cs:line 266
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
_____.MatchBlock`1.<ExecuteAsyncInternal>d__19.MoveNext() in C:\\_work\\edc7a363\\_____\\MatchBlock.cs:line 111
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
at _____.Block.BlockBase.<ExecuteAsync>d__11.MoveNext() in C:\\_work\\edc7a363\\_____\\Block\\BlockBase.cs:line 33
假设一个嵌套对象在多个线程之间的每个操作中都被重用——我认为嵌套只使用一个JsonSerializer实例——这让我觉得JSON.Net的这部分不是线程安全的。但奇怪的是,直到运行几个小时后,错误才开始发生
我该如何进一步调试这个问题呢?我的同事最终找到了这个错误——这是由于从另一个JsonConverter调用的JsonConverter内部引发了一个异常。“错误上下文”是一个内部JSON.Net对象,用于跟踪上次抛出的异常。似乎异常是由错误的JsonConverter处理的。我们向内部JsonConverter添加了一个标志,让它知道在特定上下文中不会抛出异常 当使用自定义序列化程序将枚举属性序列化为null,然后使用默认反序列化程序反序列化时,我遇到了此错误。
JsonSerializerInternalBase
是而不是JsonSerializer
的基类。对于每次调用序列化
、反序列化
或填充
,JsonSerializer
都会分配其中一个来执行实际工作,这可能是为了线程安全。1)回溯看起来不完整-它不会在Json.NET本身中显示任何回溯。您是否可以编辑该问题以包括所有内部异常的整个回溯?2) 能否显示对serializer.Serialize()
的调用,包括如何初始化?1。那个堆栈跟踪就是我的。来自BulkSearcher类的代码块将异常复制出来,并在调用线程上重新调用;我猜它丢失了完整的堆栈跟踪。我将更改代码以生成完整的跟踪,并在夜间运行它。2.NEST创建了自己的JsonSerializer,但由于我使用了调用不同JsonSerializer的自定义JsonConverter,它变得很复杂。这里有很多代码,所以在开始格式化StackOverflow之前,我将等待重新运行的结果。谢谢你的夸奖
try
{
var bulkResponse = Client.MultiSearch(searchDescriptor);
var items = bulkResponse.GetResponses<T>().ToList();
// Set response values and release all waiting tasks
var zip = currentBuffer.Zip(items, (op, result) => new { op, result });
foreach (var a in zip)
{
a.op.Response = a.result;
a.op.Cts.Cancel();
}
}
catch (Exception e)
{
foreach (var op in currentBuffer)
{
op.Error = e;
op.Cts.Cancel();
}
}
private ErrorContext GetErrorContext(object currentObject, object member, string path, Exception error)
{
if (_currentErrorContext == null)
{
_currentErrorContext = new ErrorContext(currentObject, member, path, error);
}
if (_currentErrorContext.Error != error)
{
throw new InvalidOperationException("Current error context error is different to requested error.");
}
return _currentErrorContext;
}