.net - WCF 流读取行为

标签 .net wcf stream

场景:有一个 WCF 流服务可以向客户端提供文件流。在客户端,通过调用 stream.Read(buffer, 0, chunkSize) 来读取 WCF 文件流,其中 chunkSize 为 10240。

我想知道数据是否仅在调用 Read 时才通过网络(互联网)传输,或者在后台有一些读取数据的东西,并且在调用 stream.Read 时可能已经读取了数据。我问这个是因为我需要测量下载速度。但是,在我读取了一大块数据之后,我会执行其他操作——发送事件,将刚刚读取的数据写入本地文件流。因此,我需要对这些其他操作进行折扣,以便我清楚地了解仅下载文件需要多长时间。所以我一直在测量下载 10KB 数据需要多长时间,最后 kbsPerSecond 是使用总文件大小和总时间来计算的。

不幸的是,在循环中使用秒表会导致性能下降,但我想如果我想正确测量带宽,我将不得不忍受它。

long totalBytesRead = 0;
Stopwatch stopwatch = new Stopwatch();

do
{
    int bytesRead;

    stopwatch.Start();
    bytesRead = stream.Read(buffer, 0, chunkSize);
    stopwatch.Stop();

    if (bytesRead == 0)
        break;

    totalBytesRead += bytesRead;

    // 1. write to local file stream
    // 2. raise file download progress events

} while (true);

long elapsedTime = stopwatch.ElapsedMilliseconds;
int kbsPerSecond = Convert.ToInt32(((double)totalBytesRead / 1024) / ((double)elapsedTime / 1000));

这种方法会准确吗?

最佳答案

您是否测量过秒表的实际性能影响?我只是在我的机器上进行了一个快速测试(所以 YMMV),用一个外部秒表来测量总时间,并在一个循环内用一个秒表来模拟你正在使用的那个。循环迭代了 100 万次,内部秒表的总性能影响仅为 49 毫秒(分布在所有 100 万次迭代中),因此您说的是每次迭代的单位数较低的滴答声。

除非您看到更大的影响,否则您似乎无需担心。

关于.net - WCF 流读取行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24562069/

相关文章:

c++ - 发送 std::endl 到流给出内存地址

sql - 一个数据库用于一个客户或一个用于所有客户

.net - Powershell和.NET表单对象

c# - 在 WCF 服务中读取 xml 文件时出现问题

c# - WCF 使用 MSMQ 发布/订阅

流 block 内的nginx server_name可能吗?

c# - Sitecore 7 搜索索引问题

c# - .NET 值类型在内存中的布局

wcf - 使用私钥加入 SSL .crt 证书以用于 WCF 的 Net.Tcp 绑定(bind)

php - 解压缩或膨胀 php ://input stream?