Вам необходимо правильно заразить sh и закрыть свои JsonTextWriter
и StreamWriter
, чтобы полностью заполнить memoryStream
, вот так:
var memoryStream = new MemoryStream();
// StreamWriter implements IAsyncDisposable
// Leave the underlying stream open
await using (var requestWriter = new StreamWriter(memoryStream, Encoding.UTF8, 4096, leaveOpen: true))
{
var jsonWriter = new JsonTextWriter(requestWriter); // But JsonTextWriter does not implement IAsyncDisposable, only IDisposable!
try
{
await token.WriteToAsync(jsonWriter);
}
finally
{
await jsonWriter.CloseAsync();
}
}
Демонстрационная скрипка # 1 здесь .
Или, поскольку вы пишете в MemoryStream
, на самом деле нет нужды вообще использовать async
, и вместо этого вы можете сделать:
var memoryStream = new MemoryStream();
using (var requestWriter = new StreamWriter(memoryStream, Encoding.UTF8, 4096, leaveOpen: true)) // Leave the underlying stream open
using (var jsonWriter = new JsonTextWriter(requestWriter))
{
token.WriteTo(jsonWriter);
}
Демонстрационная скрипка № 2 здесь .
Примечания:
Обратите внимание на использование await using
для StreamWriter
. Этот синтаксис гарантирует, что StreamWriter
будет сбрасываться и закрываться асинхронно и может использоваться для любого объекта, который реализует IAsyncDisposable
. (Это действительно имеет значение, только если вы выполняете запись в файловый поток или другой поток, не связанный с памятью.)
Кажется, что ни JsonTextWriter
, ни базовый класс JsonWriter
реализовать IAsyncDisposable
, поэтому мне пришлось асинхронно закрывать модуль записи JSON вручную, а не с помощью оператора using
. Внешний await using
должен гарантировать, что базовый StreamWriter
не останется открытым в случае исключения.