В настоящее время я реализовал это следующим образом.Я хотел бы знать, есть ли лучший подход, чем этот?
Я не вижу никаких проблем в том, что вы реализовали с точки зрения вашего клиента, должны быть в состоянии выполнять другие задачи (здесь, чтобывызывать другие API) во время загрузки.
Но, как замечание, я бы посоветовал не загружать весь файл за один раз.
, если вы делаете это таким образом, вашодин-единственный запрос будет слишком большим важным для вас, чтобы вы могли успешно ответить.Как будто ваша загрузка продолжается, и сеть выходит из строя, вся загрузка будет неудачной.
Вместо этого
- (если у вас его еще нет), вы создаете весь контент вбайт [] (есть несколько способов сделать это)
- разделить целый байт [] на количество кусков (с разумным размером)
- Скачать их один за другим (или даже параллельно, если у вас естьсвобода с широкополосной связью)
- Объедините их вместе на стороне клиента
- И сохраните примечание, до какого порции вы уже загрузили данные (и продолжайте обновлять эту информацию с каждым ответом)
таким образом, ваш процесс загрузки будет иметь функцию Pause-Resume, и он будет масштабируемым и устойчивым к условиям сбоя (поскольку после устранения проблемы с сетью вам нужно будет загружать только оставшиеся данные)
Вы можете разделить и объединить byte[]
, как показано ниже здесь операции со списками легко выполнить, поэтому сначала нужно преобразовать массив в список
//Suppose your main byte[] is array
List<byte> mainInputList = array.ToList();
Теперь разделитьвсе это в несколько кусков.
//making chunks (size of 10)
List<List<byte>> listOfChunks = new List<List<byte>>();
List<byte> chunks = new List<byte>();
for (int i = 0; i < mainInputList.Count; i++)
{
chunks.Add(array[i]);
if (chunks.Count == 10)
{
listOfChunks.Add(chunks);
chunks = new List<byte>();
}
}
if (chunks.Count > 0)
listOfChunks.Add(chunks);
Теперь объединяем их обратно.
//Merging Chunks
List<byte> finalByteList = new List<byte>();
foreach(List<byte> chunk in listOfChunks)
{
finalByteList.AddRange(chunk);
}
byte[] finalByteArr = finalByteList.ToArray();
для создания байта [], формирующего любой объект и создания объекта из байта []:
Как преобразовать байтовый массив в любой тип
Обновление
Цитирование важного вопроса, который поднимается в разделе комментариев.
Имейте в виду:
Если вам нужны чанки для загрузки, они, очевидно, имеют такой большой размер, что я бы не хотел хранить их в памяти, если они, наконец, будут записаны на дисктем не мение.Просто для каждого фрагмента (который должен иметь фиксированный или, по крайней мере, максимальный размер), который вы читаете, найдите позицию файла, где он принадлежит, и запишите его.Таким образом, вы можете загружать произвольно большие файлы и не ограничиваться памятью.