【发布时间】:2016-03-17 12:49:45
【问题描述】:
我相信我在下面有一个竞争条件。我正在手动构建一个带有 JSON 输出的 HttpResponseMessage 以异步流式传输。问题似乎出在计数器 (i) 上。我想在列表中第一次写入之后的任何元素之前添加一个逗号。
在列表的开头,有时第一次写入之后的前几条记录(我见过最多 3 条)不会有前面的逗号。该数字不一致,有时按预期工作。我没有在我的本地机器上看到它,但在具有更强大硬件的部署环境中它存在。
var LastUpdate = JsonConvert.SerializeObject(dt);
var pre = $"{{ \"LastUpdate\": {LastUpdate}, \"List\":[";
var post = "]}";
HttpResponseMessage response = Request.CreateResponse();
response.Content = new PushStreamContent(
async (stream, http, context) =>
{
try
{
int i = 0;
var buffer = Encoding.UTF8.GetBytes(pre);
await stream.WriteAsync(buffer, 0, buffer.Length, cancellationToken).ConfigureAwait(false);
var query = getQuery(id);
await query
.ForEachAsync(async entity =>
{
var student = MapRecord(entity);
if (student != null)
{
var json = JsonConvert.SerializeObject(student);
buffer = Encoding.UTF8.GetBytes(((i > 0) ? ", " : "") + json);
await stream.WriteAsync(buffer, 0, buffer.Length, cancellationToken).ConfigureAwait(false);
i++;
}
}, cancellationToken).ConfigureAwait(false);
buffer = Encoding.UTF8.GetBytes(post);
await stream.WriteAsync(buffer, 0, buffer.Length, cancellationToken).ConfigureAwait(false);
}
【问题讨论】:
-
ForEachAsync是如何声明的? -
@YuvalItzchakov 也许 OP 正在使用 QueryableExtensions.ForEachAsync
标签: c# asynchronous stream async-await task-parallel-library