【发布时间】:2020-01-06 18:04:34
【问题描述】:
我正在更新一些netstandard2.0 代码以不同步从HttpRequest.Body(Stream)读取(这会在netcoreapp3.0 中引发异常,除非您设置AllowSynchronousIO 选项,这显然不是一个好主意)。
我已经转换了 JSON 反序列化部分(以使用 System.Text.Json),但在此之前,它使用 StreamReader 做了一个偷偷摸摸的 .Peek()(查看主体是对象还是数组)和我不确定在哪里可以找到一种现代的异步替代方案,并且不会消耗Stream。
using var reader = new StreamReader(stream);
switch (reader.Peek()) // TODO: Find an async equivalent!
{
case '{':
return await JsonSerializer.DeserializeAsync<GraphQLRequest>(stream);
case '[':
return await JsonSerializer.DeserializeAsync<GraphQLRequest[]>(stream);
default:
// ...
}
【问题讨论】:
-
没有,使用 Task.Run() 使其异步。
-
你能不能像现在这样使用阅读器,然后
await reader.ReadAsync。然后你没有阻塞可以事先检查你正在使用数组等...... -
@HansPassant 你为什么要在另一个任务中包装一个已经可用的支持异步的阅读器?
-
在不指定类型的情况下反序列化,然后检查返回的对象并将其转换为适当的类型
-
另一方面,您可以使用
try/catch并尝试反序列化为第一种类型,而不是 case 语句,如果失败请尝试其他类型。不会有阻塞,没有装箱/拆箱。
标签: c# asynchronous .net-core stream streamreader