尽可能快地从 WCF 消费流

Consume Stream from WCF as fast as possible

设置:

App A运行3D 模型渲染图

App B 生成模型并通过 WCF 的流操作将它们(纯文本 OBJ 格式)发送到 App A

[OperationContract(IsOneWay = true)]
void VisualizeModel(Stream model);

我通过本地主机发送模型,因此带宽应该足够大以发送非常大的模型,但是我使用的渲染库从流中读取它们的方法很慢。

问题

我需要防止 App B 等待很长时间直到 App A 完全消耗它(最多需要 10 秒)。所以我尝试将输入流复制到中间流

modelDrain = new MemoryStream(1024*1024*300);
model.CopyTo(modelDrain);
modelDrain.Position = 0;

然后我开始 Task 到 运行 异步渲染,但是 我不 await 这个 Task - 这样,WCF 操作几乎在我制作副本后立即完成。以这种方式完成 WCF 操作大约需要 4 秒。但问题是我 生成 这些模型 2 秒 ,所以我怀疑构建 3D 模型比仅仅复制它轻两倍HTTP.

问题

我可以通过任何其他方式(可能通过另一个 Stream class)使用 WCF 流来加快处理速度吗?

本地主机上的 HTTP 有那么慢吗? (例如发送大约 100 Mb 的文本需要 4 秒,而生成此类数据仅需 2 秒)

在WCF中,可以通过压缩来提高传输速率encoder.The下面将比较使用压缩编码器和不使用压缩编码器的效果。

    public Stream Echo()
    {
        Bitmap bitmap = new Bitmap(1000, 40000);
        for (int i = 0; i < bitmap.Width; i++)
        {
            for (int j = 0; j < bitmap.Height; j++)
            {
                bitmap.SetPixel(i, j, (Math.Abs(i - j) < 2) ? Color.Blue : Color.Yellow);
            }
        }
        MemoryStream ms = new MemoryStream();
        bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);


        return ms;


    }

这是要传输的流。

     static void Main()
    {
        DateTime afterDT = System.DateTime.Now;
        Console.WriteLine(afterDT);
        SampleServerClient client = new SampleServerClient();
        client.Echo();
        afterDT = System.DateTime.Now;
        Console.WriteLine(afterDT);
        Console.WriteLine("OK");
        Console.ReadLine();
    }

这是客户端的代码。我会记录客户端接收流所需的时间。

这是不使用压缩编码器的时间。

这是使用压缩编码器所花费的时间。

由于gzip图片压缩效率低,传输性能没有太大提升,但如果是其他大文件,性能会提升很多。

下面link是关于WCF压缩编码器的使用方法:

https://docs.microsoft.com/en-us/dotnet/framework/wcf/samples/custom-message-encoder-compression-encoder