如何在网络流上结合处理使用ReadAsync()?

时间:2018-06-14 17:02:42

标签: c# .net networking streaming on-the-fly

我正在尝试从服务器下载一个大约500 Mb的大文件,但我没有将该文件保存到文件系统,而是试图处理它"在运行中",检索一些块数据,分析它们,当有足够的信息时,将它们保存到数据库中。这是我想要做的:

byte[] buffer = new byte[64 * 1024];
using (HttpResponseMessage response = await httpClient.GetAsync(Server + file, HttpCompletionOption.ResponseHeadersRead))
using (Stream streamToReadFrom = await response.Content.ReadAsStreamAsync())
{
    int wereRead;
    do
    {
        wereRead = await streamToReadFrom.ReadAsync(buffer, 0, buffer.Length);

        // Do the processing and saving
    } while (wereRead == buffer.Length);

我尝试使用64k的缓冲区,因为我需要处理的数据块大小相当。我的理由是,因为我正在等待'在ReadAsync上,方法调用将不会返回,直到缓冲区已满,但情况并非如此。该方法返回时只读取7k到14k字节。我试图使用一个小得多的缓冲区,但无论如何我的处理速度远远高于下载的速度,所以使用4k缓冲区我可能在第一次迭代时有一个完整的缓冲区,但是只有第二次的3k迭代。

在我的情况下是否会推荐一种方法?基本上,我希望ReadAsync仅在缓冲区已满或者到达流末尾时才返回。

0 个答案:

没有答案