簡體   English   中英

為什么在使用PushStreamContent時需要此Sleep?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM