- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 Xamarin 项目中,我有包含以下代码的 PCL 库。
我们定义一个 ConcurrentQueue<SyncRequest>
.消费者在对象初始化时为此 Task
已附上:
_syncConsumer = new Task(
ProcessSyncQueue,
_syncConsumerCancellationTokenSource.Token);
_syncConsumer.Start();
ProcessSyncQueue
方法扫描同步队列并调用 GetSyncableEntity
方法:
private async void ProcessSyncQueue()
{
while (true)
{
SyncRequest syncRequest;
if (_syncQueue.TryDequeue(out syncRequest))
{
var syncableEntity = GetSyncableEntity(syncRequest);
}
}
}
GetSyncableEntity依次进行Json反序列化:
private T GetSyncableEntity(SyncRequest syncRequest)
{
T syncableEntity = default(T);
try
{
syncableEntity = JsonConvert.DeserializeObject<T>(syncRequest.SynchronizationContent);
}
catch (Exception e)
{
}
return syncableEntity;
}
在这一步我们收到 ThreadAbortedException
带有“线程被中止”的消息。堆栈跟踪:
at Newtonsoft.Json.JsonTextReader.FinishReadStringIntoBuffer(Int32 charPos, Int32 initialPosition, Int32 lastWritePosition)
at Newtonsoft.Json.JsonTextReader.ReadStringIntoBuffer(Char quote)
at Newtonsoft.Json.JsonTextReader.ParseProperty()
at Newtonsoft.Json.JsonTextReader.ParseObject()
at Newtonsoft.Json.JsonTextReader.Read()
at Newtonsoft.Json.JsonReader.ReadAndAssert()
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings)
at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings)
at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value)
任何人都可以帮助我们了解正在发生的事情以及应该如何反序列化它吗?
更新:我发布了更多代码,因为评论者建议我删除了 CancellationTokenSource
, 使用 Task.Run
初始化消费者和await
它。并创建了一些这样的测试实现:
protected void RequestSynchronizationFor(
string synchronizationKey,
T entity)
{
if (!_isInitialized)
{
InitializeSyncRequestsQueue();
}
_syncQueue.Enqueue(GetSyncRequest(synchronizationKey, entity));
}
所以我们请求实体同步调用RequestSynchronizationFor
方法。如果是冷运行,我们从数据库调用 InitializeSyncRequestsQueue
初始化队列并等待 Task.Run
消费者线程。
private async void InitializeSyncRequestsQueue()
{
var syncRequests = GetSyncedRequests();
foreach (var syncRequest in syncRequests)
{
_syncQueue.Enqueue(syncRequest);
}
await Task.Run(ProcessSyncQueue);
}
消费者任务和以前一样做同样的事情:
private async Task ProcessSyncQueue()
{
while (true)
{
SyncRequest syncRequest;
if (_syncQueue.TryDequeue(out syncRequest))
{
var syncableEntity = GetSyncableEntity(syncRequest);
}
}
}
仍然有同样的异常。不确定它是否明智,但我正在运行单元测试中的代码。有什么建议吗?
更新 2:
在我在第一个“UPDATE”中发布的更改之后,调用堆栈也发生了一些变化:
at Newtonsoft.Json.JsonSerializer.get_MetadataPropertyHandling()
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings)
at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings)
at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value)
更新 3:我提取了假服务中的所有代码,但在尝试反序列化时仍然有相同的异常:
public class JsonDeserializeService<T>
{
private readonly bool _isInitialized;
private readonly ConcurrentQueue<SyncRequest> _syncQueue;
public JsonDeserializeService()
{
_isInitialized = false;
_syncQueue = new ConcurrentQueue<SyncRequest>();
}
public void RequestSynchronizationFor(
string synchronizationKey,
T entity)
{
if (!_isInitialized)
{
InitializeSyncRequestsQueue();
}
_syncQueue.Enqueue(GetSyncRequest(synchronizationKey, entity));
}
private async void InitializeSyncRequestsQueue()
{
var syncRequests = Enumerable.Empty<SyncRequest>();
foreach (var syncRequest in syncRequests)
{
_syncQueue.Enqueue(syncRequest);
}
await Task.Run(ProcessSyncQueue);
}
private async Task ProcessSyncQueue()
{
while (true)
{
SyncRequest syncRequest;
if (_syncQueue.TryDequeue(out syncRequest))
{
var syncableEntity = GetSyncableEntity(syncRequest);
}
}
}
private T GetSyncableEntity(SyncRequest syncRequest)
{
T syncableEntity = default(T);
try
{
syncableEntity = JsonConvert.DeserializeObject<T>(syncRequest.SynchronizationContent);
}
catch (Exception e)
{
}
return syncableEntity;
}
private SyncRequest GetSyncRequest(string synchronizationKey, T entity)
{
return new SyncRequest()
{
SynchronizationContent = JsonConvert.SerializeObject(entity),
SynchronizationDelayUntil = DateTime.Now
};
}
}
由单元测试触发:
public void Syncable_Service_Should_Not_Generate_Exception()
{
var syncService = new JsonDeserializeService<FakeSyncableEntity>();
syncService.RequestSynchronizationFor("syncKey", new FakeSyncableEntity() { Content = "Content" });
}
最佳答案
这种行为的原因很简单。您的测试比异步任务更早结束。当测试结束时,它会为子线程引发 ThreadAbortException。
需要调用task.Wait()让主线程等待任务完成。
关于c# - JsonConvert.DeserializeObject 和 ThreadAbortedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45573183/
编辑:澄清问题: 我已经覆盖了基类型的 JsonConverter(通过将 [JsonConverter(typeof(TConverter))] 应用于父类(super class)),但是当直接反
尝试使用 JsonConvert.PopulateObject 更新类属性时,未调用 JsonPathConverter,因此未完成填充。 示例类: [JsonConverter(typeof(Jso
我有一个我不能改变的类: public enum MyEnum { Item1 = 0, Item2 = 1 } public class foo { [JsonConvert
我正在使用 Json.NET (6.0.3) 进行序列化。我编写了一个自定义 JsonConverter TestConverter 来处理一些 BaseClass 的实例(通过将它们转换为整数 id
我有一个要求,我需要将默认值设置为下面的复杂属性 Instances使用 JsonProperty和 DefaultValue . 我知道我们可以为以下链接中提到的原始属性实现这一点,但需要知道我们如
我尝试查找上述比较,但找不到答案。 因为有多种方法可以获取 JObject(或所有继承自 JToken 的子类型)例如: Method1 . JObject.FromObject(obj); Meth
我已启用我的 API 以使用字符串值序列化/反序列化枚举。为此,我已将 JsonStringEnumConverter 添加到 API 的 Startup 类中受支持的 JsonConverter 列
我有一个 Employee 类,其中 Manager 属性本身是 Employee 类型 public class Employee { public string FirstName { g
我已经卡住模型(简化): part 'initial_data_model.freezed.dart'; part 'initial_data_model.g.dart'; @freezed clas
我正在尝试将两个字段和一个包含两个字段的捆绑对象发布到 Mailchimp 的 API 端点。 var store_id = ConfigurationManager.AppS
以下VB.NET代码使用Newtonsoft JSON.NET库,并在按钮单击事件处理程序中执行并阻止UI线程: Dim table As DataTable = Await Task.Factory
我遇到了一个问题,其中以下 ToJson() 方法返回的字符串仅为“{}” public class GenericRequest { publ
这个问题在这里已经有了答案: JSON Can't be Deserialized to Object, Needs Array? (2 个答案) 关闭 9 年前。 我有这个 Json 返回: [
我遇到了一个问题,其中以下 ToJson() 方法返回的字符串仅为“{}” public class GenericRequest { publ
这个问题在这里已经有了答案: JSON Can't be Deserialized to Object, Needs Array? (2 个答案) 关闭 9 年前。 我有这个 Json 返回: [
我创建了一个简单的类: public class TestObject { public TestObject(int id, string name, List list) {
我有一个像这样的 Json 对象: {"company": "My Company", "companyStart" : "2015/01/01", "employee" : { "name"
这是 json: { "odata.metadata": ".....", "value": [ { "AbsEntry": 10,
我有一个对象,其中包含一个具有 JsonConverter 属性的属性。对于数据读写,转换器不工作。声明的属性是 [JsonConverter(typeof(EpochDateTimeConverte
编辑:制作了一个更简单、更透明的示例案例 我正在尝试反序列化一组组件(属于一个实体)。其中一个组件是 Sprite 组件,它包含纹理和动画信息。我为此实现了一个 CustomConverter,因为原
我是一名优秀的程序员,十分优秀!