Как вернуть MemoryStream из функции?
У меня есть метод, который возвращает MemoryStream. Так получается, что когда я вызываю этот метод на Windows, то он работает корректно и возвращает данные, записанные в MemoryStream. Однако, если я вызываю этот метод на Linux, то метод возвращает пустой Stream. С чем это может быть связано? (Используется .NET Core)
public async Task<Stream> GetInfo()
{
MemoryStream ms = new MemoryStream();
bool bytesReceived = false;
do
{
byte[] buffer = await storage.ReadAsync();
await ms.WriteAsync(buffer, 0, buffer.Length);
bytesReceived = buffer.Length != 0;
}
while(bytesReceived);
ms.Seek(0, SeekOrigin.Begin);
return ms;
}
Вот место откуда вызывается этот метод:
public async Task ReadData()
{
var info = await GetInfo();
var reader = new StreamReader(info);
var dataString = reader.ReadToEnd();
Console.WriteLine(dataString);
}
Вот метод ReadAsync:
public async Task<byte[]> ReadAsync()
{
byte[] buffer = new byte[10];
await activeStream.ReadAsync(buffer, 0, buffer.Length);
return buffer;
}
Ответы (2 шт):
Проблема кроется в другом месте. И связана она со storage. Это Linux там нужно следить за доступом, а MemoryStream проверяется легко.
Попробуйте так чтоб исключить вашу проблему.
public async Task<Stream> GetInfo()
{
MemoryStream ms = new MemoryStream();
bool bytesReceived = false;
do
{
byte[] buffer = Encoding.ASCII.GetBytes("Hello world!!!!");
await ms.WriteAsync(buffer, 0, buffer.Length);
bytesReceived = buffer.Length != 0;
}
while(bytesReceived);
ms.Seek(0, SeekOrigin.Begin);
return ms;
}
Всем спасибо. Нашел решение для моего случая. Ситуация была такая, что метод висел на ожидании получения данных от метода ReadAsync. Поэтому как я думал в консоль ничего не выводилось. А на самом деле висело в цикле.
public async Task<Stream> GetInfo()
{
MemoryStream ms = new MemoryStream();
bool bytesReceived = false;
do
{
Task<byte[]> buffer = await storage.ReadAsync();
await ms.WriteAsync(buffer.Result, 0, buffer.Result.Length);
bytesReceived = buffer.Result.Length != 0;
}
while(bytesReceived);
ms.Seek(0, SeekOrigin.Begin);
return ms;
}