karekarmahadev Ответов: 2

Как загрузить 10000+ файлов асинхронно на локальный компьютер с помощью 4.0 .NET framework,


У меня есть требование асинхронно загружать более 10000 файлов из Sharepoint online.
Но есть некоторые ограничения на фреймворк, он должен быть закодирован using.NET только фреймворк 4.0. Следовательно, не может продвинутая библиотека TPL. Я хотел использовать асинхронный шаблон на основе задач (TAP): "Асинхронное программирование - C# | Microsoft Docs[^]

Как загрузить несколько файлов с помощью асинхронного способа?

приведенный ниже метод кода выполняется для каждого файла синхронно, возможно ли, что я делаю вызов этого метода асинхронным с помощью пакетной логики?

Что я уже пробовал:

private bool WritetoDisk(ClientContext context, Microsoft.SharePoint.Client.File file, string ListName)
      {
          try
          {


              var sw = new Stopwatch();
              sw.Start();

              string Destination = @"c:\\temp";
              string destinationfolder = Destination + "/" + ListName;

              Stream fs = Microsoft.SharePoint.Client.File.OpenBinaryDirect(context, file.ServerRelativeUrl).Stream;

              byte[] binary = ReadFully(fs);


              if (!Directory.Exists(destinationfolder))
              {
                  Directory.CreateDirectory(destinationfolder);
              }

              FileStream stream = new FileStream(destinationfolder + "/" + file.Name, FileMode.Create);

              BinaryWriter writer = new BinaryWriter(stream);

              writer.Write(binary);

              writer.Close();
              sw.Stop();


          }
          catch (Exception e)
          {
          }
          return true;
      }

Gerry Schmitz

Ха-ха - ха-ха-ха-ха. Ты смешной.

Richard MacCutchan

Вы можете просто запустить более 10000 копий вашего приложения.

Afzaal Ahmad Zeeshan

На 10 000 машинах, с выделенной пропускной способностью сети. :смеяться:

2 Ответов

Рейтинг:
13

OriginalGriff

Не говори глупостей.
То, что вы пытаетесь сделать (я подозреваю), это запустить 10 000+ загрузок одновременно, а не асинхронно - и это никоим образом не улучшит скорость загрузки: это может сделать ее медленнее (это почти наверняка будет), и это, скорее всего, приведет к сбою приложения или, возможно, одной или другой из систем.

Почему?
Что ж... вы когда-нибудь слышали о DDoS? Распределенный отказ в обслуживании? Это работает путем наводнения сервера запросами, так что он настолько занят, что выходит из строя или иным образом не может обрабатывать новые (законные) запросы.
И это то, что вы пытаетесь сделать, без "распределенной" части.

Независимо от того, сколько памяти у вас есть, вы исчерпаете ее: и тогда система yoru перейдет в режим измельчения, когда она начнет подкачку на диск, чтобы освободить память для добавления новых загрузок, которые уже используют так много пропускной способности, что ваше интернет-соединение замедляется до ползания ...

Нет, ты не можешь этого сделать.


karekarmahadev

@OriginalGriff, Спасибо за ваши комментарии!!. Да, вы правы, я пытался использовать многопоточный подход, но приложение перешло в режим "не отвечает".

OriginalGriff

Всегда пожалуйста!

Рейтинг:
0

Afzaal Ahmad Zeeshan

Цитата:
10000+ файлов асинхронно из Sharepoint online
Тогда почему бы вам не использовать для этого SDK SharePoint? Они позаботятся о том, как заказать задания загрузки, загрузить и предоставить вам более 10 000 файлов на вашем компьютере.

Добро пожаловать в пакет SDK Microsoft SharePoint 2010 | Microsoft Docs[^]
Цитата:
Но есть некоторые ограничения на фреймворк, он должен быть закодирован using.NET только фреймворк 4.0. Следовательно, не могу использовать библиотеку TPL.
Но вы можете использовать TPL в .Чистый фреймворк 4.0. Не примите мое слово для этого,
Начиная с .NET Framework 4, TPL является предпочтительным способом написания многопоточного и параллельного кода.
Таким образом, в принципе, вы можете сделать и то, и другое без каких—либо проблем-прочитайте ответ OriginalGriff о том, какие ограничения вы столкнетесь на своей собственной машине, а также на серверах Microsoft. Хороший способ выполнить это требование-сначала заархивировать папку (или файлы, где бы они ни находились), а затем загрузить этот единственный zip-файл.

Помните, что при асинхронном подходе вы не улучшаете производительность или время загрузки, а скорее (в масштабе 10 000+ задач) ухудшаете производительность в большом масштабе. Каждая задача потребует интернета, а также ресурсов памяти и процессора, и это может вызвать голод в ваших задачах... Много плохого случится, так сказать.


karekarmahadev

- Тогда почему вы не используете для этого SDK SharePoint? Они позаботятся о том, как заказать задания загрузки, загрузить и предоставить вам более 10 000 файлов на вашем компьютере."

Да, я использую SDK SharePoint, который позволяет мне загружать более 10000 файлов без каких-либо проблем. Что я хотел сделать, так это ускорить эту операцию, поэтому думал об асинхронном способе. Но, согласно некоторым комментариям экспертов выше, похоже, что это не очень хороший подход.

Afzaal Ahmad Zeeshan

Улучшение скорости загрузки не требует никакого программирования (кроме некоторых тонких настроек), но в реальности оно требует хорошего подключения к интернету.

karekarmahadev

"Но вы можете использовать TPL в .Чистый фреймворк 4.0. Не примите мое слово для этого, "
согласитесь, то, что я хотел использовать, было Aync/Task, мой плохой я думал, что это часть TPL.
Асинхронный шаблон на основе задач (TAP). https://docs.microsoft.com/en-us/dotnet/csharp/async