Информация об изменениях

Сообщение Re[3]: Очередь задач с ограничением числа исполняемых одновр от 24.12.2024 17:21

Изменено 24.12.2024 17:21 bnk

Re[3]: Очередь задач с ограничением числа исполняемых одновр
Здравствуйте, Codealot, Вы писали:

bnk>>Тогда Chat GPT имеет готовое решение например даже не в 50 строк, а в 20.


C>Вот уж точно не источник надежной информации

C>Хотя интересно посмотреть, где он налажал. Как ты сформулировал задачу?

  вот
[code]
    static async Task DownloadFilesAsync(List<string> urls, int maxParallelDownloads)
    {
        using var httpClient = new HttpClient();
        using var semaphore = new SemaphoreSlim(maxParallelDownloads);

        var tasks = new List<Task>();
        foreach (var url in urls)
        {
            await semaphore.WaitAsync();
            tasks.Add(Task.Run(async () =>
            {
                try
                {
                    var response = await httpClient.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
                    response.EnsureSuccessStatusCode();

                    var fileName = Path.GetFileName(new Uri(url).LocalPath);
                    await using var fs = new FileStream(fileName, FileMode.Create);
                    await (await response.Content.ReadAsStreamAsync()).CopyToAsync(fs);
                }
                finally
                {
                    semaphore.Release();
                }
            }));
        }
        await Task.WhenAll(tasks);
    }

C>Впрочем, ты тоже хорош. Требования сильно разные.

Ну я просто предположил что задача такая. Зачем бы еще это могло понадобиться?
Re[3]: Очередь задач с ограничением числа исполняемых одновр
Здравствуйте, Codealot, Вы писали:

bnk>>Тогда Chat GPT имеет готовое решение например даже не в 50 строк, а в 20.


C>Вот уж точно не источник надежной информации

C>Хотя интересно посмотреть, где он налажал. Как ты сформулировал задачу?

  вот
    static async Task DownloadFilesAsync(List<string> urls, int maxParallelDownloads)
    {
        using var httpClient = new HttpClient();
        using var semaphore = new SemaphoreSlim(maxParallelDownloads);

        var tasks = new List<Task>();
        foreach (var url in urls)
        {
            await semaphore.WaitAsync();
            tasks.Add(Task.Run(async () =>
            {
                try
                {
                    var response = await httpClient.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
                    response.EnsureSuccessStatusCode();

                    var fileName = Path.GetFileName(new Uri(url).LocalPath);
                    await using var fs = new FileStream(fileName, FileMode.Create);
                    await (await response.Content.ReadAsStreamAsync()).CopyToAsync(fs);
                }
                finally
                {
                    semaphore.Release();
                }
            }));
        }
        await Task.WhenAll(tasks);
    }

C>Впрочем, ты тоже хорош. Требования сильно разные.

Ну я просто предположил что задача такая. Зачем бы еще это могло понадобиться?