#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 звучит как аккуратная замена для каждого повторного создания массивов коротких ответов.