Как запросить много файлов на серверах? (синхронизация, асинхронность, другой способ)C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Гость
 Как запросить много файлов на серверах? (синхронизация, асинхронность, другой способ)

Сообщение Гость »

У меня есть приложение, в котором я буду запрашивать файлы с некоторых серверов. У меня есть N серверов, и с каждого сервера я буду запрашивать X файлов, где X различен для каждого сервера.
Метод запроса файлов с серверов является асинхронным, из HttpClient.
Я думал о нескольких вариантах:
Вариант 1: foreach и ожидание каждой итерации

Код: Выделить всё

public class Application
{
private readonly List _servers = [];

public async Task RequestFiles()
{
foreach(Server iteratorServer in Servers)
{
await iteratorServer.RequestFiles();
}
}
}

public class Requester
{
private readonly HttpClient _httpClient;
private readonly List _files = [];

public async Task ReqeustFiles()
{
foreach(File iteratorFile in _files)
{
await _httpClient.GetStreamAsAsync("URL");
}
}
}
Вариант 2: в методе реквестера добавить задачу в список и дождаться всех задач. В этом случае, я думаю, возможно, ожидание всего сразу, а не ожидание каждой итерации, могло бы быть немного более эффективным.
Приложение открытого класса
{
Частное только для чтения Список _servers = [];

Код: Выделить всё

public async Task RequestFiles()
{
foreach(Server iteratorServer in Servers)
{
await iteratorServer.RequestFiles();
}
}
}
Сервер общедоступного класса
{
частный HttpClient только для чтения _httpClient;
частный список только для чтения _files = [ ];

Код: Выделить всё

public async Task ReqeustFiles()
{
List tasks = [];
foreach(File iteratorFile in _files)
{
Task.Add(_httpClient.GetStreamAsAsync("URL"));
}

wait Task.WhenAll(tasks);
}
Вариант 3: добавить в класс приложения задачи списком и дождаться всех и сделать то же самое в реквестере. Это похоже на вариант 2, но делает то же самое в классе приложения.
public class Application
{
частный список только для чтения _servers = [];

Код: Выделить всё

public async Task RequestFiles()
{
List tasks = [];
foreach(Server iteratorServer in Servers)
{
Tasks.Add(iteratorServer.RequestFiles());
}

await Task.WhenAll(tasks);
}
}
запрашивающий общедоступный класс
{
частный HttpClient только для чтения _httpClient;
частный список только для чтения _files = [ ];

Код: Выделить всё

public async Task ReqeustFiles()
{
List tasks = [];
foreach(File iteratorFile in _files)
{
Task.Add(_httpClient.GetStreamAsAsync("URL"));
}

wait Task.WhenAll(tasks);
}
Вариант 4: используйте параллельный foreach вместо параллельного в трех вариантах.
Лучше один вариант, чем другой? на практике то же самое? в чем разница? Есть ли другие варианты, которые могут быть лучше?
Спасибо.

Подробнее здесь: https://stackoverflow.com/questions/782 ... nother-way
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Есть ли способ проверить, есть ли обновления системы на серверах Windows?
    Anonymous » » в форуме C#
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Есть ли способ проверить, есть ли обновления системы на серверах Windows? [дублировать]
    Anonymous » » в форуме C#
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous
  • Правильный способ выполнить задание и асинхронность?
    Anonymous » » в форуме C#
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Правильный способ выполнить задание и асинхронность? [дублировать]
    Anonymous » » в форуме C#
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Discord-бот не отвечает на сообщения на серверах
    Anonymous » » в форуме Python
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»