Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# &引用;当前错误上下文错误与请求的错误不同;Json.Net中的异常 上下文_C#_Multithreading_Json.net_Nest_<img Src="//i.stack.imgur.com/A3TTx.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch Net - Fatal编程技术网 elasticsearch-net,C#,Multithreading,Json.net,Nest,elasticsearch Net" /> elasticsearch-net,C#,Multithreading,Json.net,Nest,elasticsearch Net" />

C# &引用;当前错误上下文错误与请求的错误不同;Json.Net中的异常 上下文

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一起使用

我用C#编写了一个并行作业框架,从ElasticSearch集群导入/导出大量数据。为此,我将单个项的每个导入或导出建模为一个对象,该对象在某个点由框架执行。为了与ElasticSearch接口,我使用了NEST(官方的.NETElasticSearch客户端库)v1.7.1和JSON.NET7.0.1

每个导入/导出任务对象都使用嵌套与ElasticSearch交互。出于性能原因,我编写了一个代理类,它将任务对象生成的搜索请求分组到固定大小的批中,以便与NEST的_msearchAPI一起使用。此类的调用程序将延迟,直到其批处理返回

我的框架将每个导入/导出任务的结果包装为“bool”或“Exception”。即使遇到个别项目的错误,整个过程也能够继续

问题 在几个小时无误地完成任务后,我发现以下异常出现了数千次:

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