private const int _maxSize = 3 * 1024 * 1024;
private byte[] _part = new byte[_maxSize];
private FileRequest _fileRequest;
private async void UploadFiles(InputFileChangeEventArgs e)
{
foreach (var file in e.GetMultipleFiles())
{
try
{
using var call = GreeterClient.DownloadFile();
ShowMessage($"Началась загрузка: {file.Name}",Severity.Normal);
using (var ms = file.OpenReadStream(file.Size))
{
while (ms.Length - ms.Position > 0)
{
if (ms.Length - ms.Position <= _maxSize)
_part = new byte[ms.Length - ms.Position];
await ms.ReadAsync(_part, 0, _part.Length);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//отправка не сервер. Google.Protobuf.UnsafeByteOperations.UnsafeWrap Съедает оперативу. хотя он не копирует данные,
//в отличии от обычного метода Google.Protobuf.ByteString.CopyFrom, который съедает примерно так же...
_fileRequest = new FileRequest { FileName = file.Name, FileBytes = Google.Protobuf.UnsafeByteOperations.UnsafeWrap(_part) };
await call.RequestStream.WriteAsync(_fileRequest);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
_fileRequest = null;
}
await ms.DisposeAsync();
}
await call.RequestStream.CompleteAsync();
var response = await call;
var status = response.Status;
ShowMessage(status,Severity.Success);
call.Dispose();
}
catch(Exception ex)
{
ShowMessage(ex.Message, Severity.Error);
}
StateHasChanged();
}
}
FileBytes = Google.Protobuf.UnsafeByteOperations.UnsafeWrap(_part)
? Ведь итак и так отправляется массив байт? Вроде по описанию там просто объект обертки создается для масива._part = new byte[ms.Length - ms.Position];
- тут при медленной скорости может создаваться массив несколько раз.