我一直在尝试解决这个"并发编程"考试练习(在C#中):
知道
Stream该类包含int Read(byte[] buffer, int offset, int size)和void Write(byte[] buffer, int offset, int size)方法,在C#中实现NetToFile将从NetworkStream net实例接收的所有数据复制到FileStream file实例的方法.要进行传输,请使用异步读取和同步写入,以避免在读取操作期间阻塞一个线程.当net读取操作返回值0 时,传输结束.为简化起见,不必支持操作的受控取消.
void NetToFile(NetworkStream net, FileStream file);
Run Code Online (Sandbox Code Playgroud)
我一直试图解决这个问题,但我正在努力解决与问题本身相关的问题.但首先,这是我的代码:
public static void NetToFile(NetworkStream net, FileStream file) {
byte[] buffer = new byte[4096]; // buffer with 4 kB dimension
int offset = 0; // read/write offset
int nBytesRead = 0; // number of bytes read on each cycle
IAsyncResult ar;
do {
// …Run Code Online (Sandbox Code Playgroud) 我正在使用流式传输模式的WCF绑定,用于向服务上载和从服务下载二进制内容.我设法让它运作起来.我将包括配置,合同等以供参考.
我做了一些测试来测试不同的绑定和编码.上传结果似乎没问题.NetTcp是最快的,其次是BasicHttp-MTOM,然后是BasicHttp-Text.让我感到惊讶的是,在下载大文件时,与使用BasicHttp的文本编码和使用NetTcp的二进制编码相比,MTOM非常慢.
我错过了什么吗?为什么在上传时BasicHttp-MTOM的工作速度比其他绑定慢?除此之外,我还为下载实现了双缓冲.除了带有MTOM编码的BasicHttp之外,这也适用于所有绑定.为什么使用MTOM时双缓冲无效?
感谢您的阅读,您对此的建议和想法.
检测结果:
将150 MB二进制数据上载到服务.客户端从150 MB文件创建文件流并传递给服务器.服务器将流读入内存流.还没有双重缓冲.由于没有向文件系统写入数据,因此结果似乎很快.并且绑定按预期执行.

从服务下载100 MB二进制数据.服务创建内存流并传递给客户端.客户端写入文件系统.以下是单缓冲区和双缓冲区的结果.正如您所看到的,MTOM似乎非常慢,并且也不响应双缓冲.

服务器配置(为简单起见省略了一些部分):
<configuration>
<system.web>
<httpRuntime maxRequestLength="2147483647"/>
</system.web>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="StreamedNetTcpBinding"
transferMode="Streamed"
maxReceivedMessageSize="1099511627776">
</binding>
</netTcpBinding>
<basicHttpBinding>
<binding name="StreamedBasicHttpBindingWithMtom"
messageEncoding="Mtom" transferMode="Streamed"
maxReceivedMessageSize="1099511627776">
</binding>
<binding name="StreamedBasicHttpBinding"
transferMode="Streamed"
maxReceivedMessageSize="1099511627776">
</binding>
</basicHttpBinding>
</bindings>
</system.serviceModel>
</configuration>
Run Code Online (Sandbox Code Playgroud)
客户端配置(为简单起见省略了一些部分):
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="StreamedBasicHttpBindingWithMtom"
maxReceivedMessageSize="1099511627776"
messageEncoding="Mtom" transferMode="Streamed">
</binding>
<binding name="StreamedBasicHttpBinding"
maxReceivedMessageSize="1099511627776"
transferMode="Streamed">
</binding>
</basicHttpBinding>
<netTcpBinding>
<binding name="StreamedNetTcpBinding" transferMode="Streamed"
maxReceivedMessageSize="1099511627776">
</binding>
</netTcpBinding>
</bindings>
</system.serviceModel>
</configuration>
Run Code Online (Sandbox Code Playgroud)
服务合约:
[ServiceContract]
public interface IFileService
{
[OperationContract]
void UploadFile(DocumentData document);
[OperationContract]
DocumentData …Run Code Online (Sandbox Code Playgroud)