[英]Why is this Sleep needed when using PushStreamContent?
在GitHub上參考以下示例代碼: https : //github.com/DblV/StreamingWebApi/blob/master/StreamingService/StreamingService/Controllers/StreamingController.cs
我想流式傳輸存儲在數據庫中的內容,我的查詢以一系列Blob(實際上是一個文件分成“塊”)的形式返回。 由於完整響應的潛在大小,因此我想對其進行流式處理,並按照以下示例進行操作:
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
,它可以正常完成,並且最終的下載是完美的。
我的問題是: Sleep
在做什么可以避免掛起狀況? 我懷疑這更多是一種變通辦法,而不是適當的解決方案。 如果是這樣,我應該怎么做?
發現這是我的錯誤。 我錯誤地使用了CopyToAsync
,而應該使用CopyTo
。 更正此錯誤,效果很好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.