Как избежать создания новых массивов байтов для каждого вызова метода работы WCF?

#c# #.net #arrays #wcf #f#

#c# #.net #массивы #wcf #f#

Вопрос:

Есть ли способ избежать создания новых экземпляров массива байтов с фиксированной длиной и вызова Array.Copy из большего массива байтов Buffer вновь созданного массива ответов с вызовом reply ?

  • Измените API хоста WCF!?
  • Использовать неизвестный мне метод, который создает представление, похожее на массив, и поведение в другом массиве?

Или какие-либо другие идеи?

 // 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:

Вы можете использовать ArraySegment<T> как способ передачи фрагментов большего массива байтов. Я думаю, что API довольно дерьмовый, но он, безусловно, делает свое дело.

Однако, похоже, вам, вероятно, также было бы полезно использовать класс BufferManager, предоставляемый для WCF для управления повторно используемыми буферами в вашем коде.

Комментарии:

1. У меня такое чувство, что WCF может не знать, как маршалировать экземпляры ArraySegment<byte> по проводам. BufferManager звучит как аккуратная замена для каждого повторного создания массивов коротких ответов.