使用PushStreamContent时为什么需要睡眠?

时间:2018-01-19 16:37:10

标签: c# asp.net-web-api streaming

在GitHub上参考此示例代码: https://github.com/DblV/StreamingWebApi/blob/master/StreamingService/StreamingService/Controllers/StreamingController.cs

我想流式传输存储在数据库中的内容,我的查询将其作为一系列blob返回(实际上是一个文件分成"块")。由于完整响应的潜在大小,我想流式传输,我按照以下示例进行操作:

paths

请注意public class FileController : ApiController { [HttpGet] public HttpResponseMessage Get(string id, [FromUri] string contentType) { var message = new HttpResponseMessage(HttpStatusCode.OK); message.Content = new PushStreamContent((stream, content, context) => { GetFileContent(stream, int.Parse(id)); Thread.Sleep(1000); stream.Close(); }); message.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType); return message; } private void GetFileContent(Stream stream, int id) { var result = Query(reader => reader.GetStream(0), id); foreach (var b in result) { b.CopyToAsync(stream); stream.Flush(); } } private IEnumerable<Stream> Query(Func<DbDataReader,Stream> func, int id) { var command = // Not shown - SELECT command creating the result set var reader = command.ExecuteReader(); if (reader.HasRows) { while (reader.Read()) { yield return func(reader); } } reader.Close(); } 的使用和展示位置。当我在浏览器中对此进行测试时,内容会下载到文件中,但如果没有Thread.Sleep,则会在完成时挂起;使用Sleep,它可以正常完成,并且最终的下载非常完美。

我的问题:Sleep做什么可​​以避免挂起情况?我怀疑这是一个解决方案,而不是一个适当的解决方案;如果是这样,我应该做什么呢?

1 个答案:

答案 0 :(得分:1)

发现这是我的错误。我错误地使用CopyToAsync我应该使用CopyTo。纠正这个错误,它运作得很好。