如何避免为每次调用WCF操作方法创建新的字节数组



是否有一种方法可以避免创建具有固定长度的新字节数组实例并从较大的字节数组Buffer调用Array.Copy到新创建的应答数组reply ?

  • 更改WCF主机的API !?
  • 使用to-me-unbeknow方法创建一个指向另一个数组的看起来&行为视图?

还有其他想法吗?

// Buffer : byte[]
// host : a WCF host
while (code >= 0)
{
    try
    {
        if (Socket.Available == 0)
        {
            Thread.Sleep(Wait);
            continue;
        }
        var length = Socket.Receive(Buffer);
        if (length > 0)
        {
            Log("Read", ServerPort, " ->", Client, length);
            var reply = new byte[length];
            Array.Copy(Buffer, reply, length);
            try { code = host.Reply(ServerPort, Client, reply); }
            catch (Exception ex)
            {
                code = -2;
                Log("Exception", ServerPort, "<=>", Client, ex);
                ConnectToHost();
            }
        }
    }
    catch (Exception ex)
    {
        code = -3;
        Delist();
        if (ex.GetType() != typeof(ThreadAbortException))
            Log("Exception", ServerPort, "!!!", Client, ex);
        Log("Disconnect", ServerPort, @"<>", Client, Relay.Host.Address());
        Tcp.Close();
    }

你可以使用ArraySegment作为传递较大字节数组片段的一种方式。我认为这个API有点蹩脚,但它确实做到了。

但是,使用WCF提供的BufferManager类来管理代码中的可重用缓冲区似乎也会受益。

最新更新