Высокое использование процессора в CoreWCF после потоковой передачиC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Высокое использование процессора в CoreWCF после потоковой передачи

Сообщение Anonymous »

У меня очень простой класс службы: < /p>

Код: Выделить всё

namespace RandomNumberCore;

[ServiceContract]
public interface IStreamingService
{
[OperationContract]
Stream GetRandomStream();
}

public class StreamingService : IStreamingService
{
public Stream GetRandomStream()
{
var stream = new RandomStream(Random.Shared);
return stream;
}
}
, где randomstream -это поток, который возвращает случайные байты:

Код: Выделить всё

namespace RandomNumberCore;

public class RandomStream : Stream
{
public RandomStream(Random random)
{
this._random = random;
}

private int _sequence;
private readonly Random _random;
public override bool CanRead => true;

public override bool CanSeek => false;

public override bool CanWrite => false;

public override long Length => throw new NotSupportedException();

// ReSharper disable once ValueParameterNotUsed
public override long Position { get => _sequence; set => throw new NotSupportedException(); }

public override void Flush()
{}

public override int Read(byte[] buffer, int offset, int count)
{
var internalBuffer = new Span(buffer, offset, count);
_random.NextBytes(internalBuffer);
_sequence+=count;
return count;
}

public override int Read(Span buffer)
{
_random.NextBytes(buffer);
_sequence+=buffer.Length;
return buffer.Length;
}

public override long Seek(long offset, SeekOrigin origin)
{
throw new NotSupportedException();
}

public override void SetLength(long value)
{
throw new NotSupportedException();
}

public override void Write(byte[] buffer, int offset, int count)
{
throw new NotSupportedException();
}
}
< /code>
и простой клиент: < /p>
async Task Main()
{

var cts = new CancellationTokenSource();

Util.Cleanup += (_,_) => cts.Cancel();

var endpointBinding = new BasicHttpBinding(BasicHttpSecurityMode.Transport){TransferMode = TransferMode.Streamed, MaxReceivedMessageSize = 1_000_000_000 };
var address = "https://localhost:7151/StreamingService.svc";
using var channelFactory = new ChannelFactory(endpointBinding, new EndpointAddress(address));
using var service = channelFactory.CreateChannel();

service.Open();

using var randomStream = service.GetRandomStream();

byte[] buffer = new byte[4];
await randomStream.ReadExactlyAsync(buffer, cts.Token);

buffer.Dump();

service.Close();

}
Код, по -видимому, работает нормально, я могу читать поток, и он, по -видимому, содержит случайные байты. Профилирование он не обеспечил особого освещения, похоже, что в какой -то обработке ошибок под corewcf.dispatcher.imtabledispatchruntime.processmessageasync , но неясно, что на самом деле происходит.
Полный код https://github.com/richardcocks/wcftest ... sueonclose

Подробнее здесь: https://stackoverflow.com/questions/796 ... -streaming
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»