Как избежать создания новых байтовых массивов для каждого вызова метода операции WCF? - PullRequest
0 голосов
/ 07 апреля 2011

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

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

Или любой другойидеи?

// 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 Ответ

1 голос
/ 07 апреля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...