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

时间:2011-04-07 13:21:32

标签: c# .net arrays wcf f#

有没有办法避免创建具有固定长度的新字节数组实例,并从较大的字节数组Array.Copy调用Buffer到名为reply的新创建的回复数组?

  • 更改WCF主机的API!?
  • 使用一种我不知道的方法,在另一个数组上创建一个看起来像数组的视图?

还是其他任何想法?

// 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();
    }

1 个答案:

答案 0 :(得分:1)

您可以使用ArraySegment<T>作为传递更大字节数组的方法。我认为API有点蹩脚,但它确实可以解决问题。

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