Асинхронные задачи застряли в ожидании активацииC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Асинхронные задачи застряли в ожидании активации

Сообщение Anonymous »

Я написал простой инструмент нагрузочного тестирования, позволяющий отправлять 1000 запросов на медленную конечную точку в течение двух секунд. Большинство задач Async завершаются, но в конечном итоге инструмент зависает, поскольку некоторые задачи зависают в состоянии WaitingForActivation, и я не могу понять, почему.
Возможно, это из-за пула потоков исчерпание ниток? Любые рекомендации по дальнейшему устранению этой неполадки.
Ниже приведен мой код.

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

// See https://aka.ms/new-console-template for more information
using System.Threading;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using System.Collections.Concurrent;

CancellationTokenSource cts = new CancellationTokenSource();

await new Client().PerformRequestsAsync("https://www.slowendpoint.test", 1000, 1000, cts.Token);
Console.WriteLine("All Done");
public class Client
{

public static int completedCount = 0;
public static int headerCompletedCount = 0;
public static int allCompletedCount = 0;
public static int failedCompletedCount = 0;
public async Task PerformRequestsAsync(string url, int maxConcurrency, int totalRequests, CancellationToken cancellationToken)
{

try
{
var tasks = new List();
for (int i = 0; i < totalRequests; i++)
{
if(i==500)
await Task.Delay(1000);

// Wait to proceed until it is safe to do so
tasks.Add(SendAsync(url, cancellationToken));
}

// Wait for all tasks to complete
await Task.WhenAll(tasks);
}
catch (Exception ex)
{
Console.WriteLine($"An error occurred: {ex.Message}");
}
finally
{
// Release the semaphore whether success or fail
}

}

async Task SendAsync(string url, CancellationToken cancellationToken)
{
try
{
using (var httpClient = new HttpClient())
{
// Send the request and instruct HttpClient to complete as soon as headers are read
var request = new HttpRequestMessage(HttpMethod.Get, url);
var response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken);
Console.WriteLine("HCC: " + Interlocked.Increment(ref headerCompletedCount) + " BCC: " + completedCount + " ACC: " + allCompletedCount + " FCC: " + failedCompletedCount);

Console.WriteLine($"Headers received: {response.StatusCode}");

// Now read the response body in chunks of 64 KB
const int bufferSize = 64 * 1024; // 64 KB
var buffer = new byte[bufferSize];
var totalRead = 0;

using (var responseStream = await response.Content.ReadAsStreamAsync())
{
int bytesRead;
while ((bytesRead = await responseStream.ReadAsync(buffer, 0, buffer.Length, cancellationToken)) > 0)
{
totalRead += bytesRead;
//Console.WriteLine($"Read {bytesRead} bytes this chunk, total {totalRead} bytes read.");
// Process the chunk as needed (omitted for brevity)
}
}
Console.WriteLine("BCC: " + Interlocked.Increment(ref completedCount) + " HCC: " + headerCompletedCount + " ACC: " + allCompletedCount + " FCC: " + failedCompletedCount);

Console.WriteLine("Completed reading the response.");

Console.WriteLine("ACC: " + Interlocked.Increment(ref allCompletedCount) + " BCC: " + completedCount + " HCC: " + headerCompletedCount + " FCC: " + failedCompletedCount);

}
}
catch (Exception ex)
{
Console.WriteLine($"An error occurred: {ex.Message}");
Console.WriteLine("FCC: " + Interlocked.Increment(ref failedCompletedCount) + " BCC: " + completedCount + " HCC: " + headerCompletedCount + " ACC: "  + allCompletedCount);
}
}
}
Программа в какой-то момент зависает с выводом, как показано ниже.
Вывод начинается примерно с этого
FCC: 2 BCC: 3 HCC: 997 ACC: 3

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

FCC: 3 BCC: 3 HCC: 997 ACC: 3

BCC: 4 HCC: 997 ACC: 3 FCC: 3

Завершено чтение ответа.
ACC: 4 BCC: 4 HCC: 997 FCC: 3

HCC: 998 BCC: 4 ACC: 4 FCC: 3

Полученные заголовки: ОК

HCC: 999 BCC: 4 ACC: 4 FCC: 3

Полученные заголовки: ОК

HCC: 1000 BCC: 4 ACC: 4 FCC: 3

Полученные заголовки: ОК

BCC: 5 HCC: 1000 ACC: 4 FCC: 3

Прочитал ответ.

ACC: 5 BCC: 5 HCC: 1000 FCC: 3

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

.

.

.

.

.

.

.

А затем заморозьте что-то вроде ниже

ACC: 980 BCC: 980 HCC: 1000 FCC: 5

BCC: 981 HCC: 1000 ACC: 980 FCC: 5

Чтение завершено ответ.

ACC: 981 BCC: 981 HCC: 1000 FCC: 5

BCC: 982 HCC: 1000 ACC: 981 FCC: 5

ACC: 982 BCC: 982 HCC: 1000 FCC: 5

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

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как параллелизировать асинхронные звонки в ожидании назначения имущества?
    Anonymous » » в форуме Javascript
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Задачи Django Q застряли в очереди
    Anonymous » » в форуме Python
    0 Ответы
    30 Просмотры
    Последнее сообщение Anonymous
  • Асинхронные задачи зависают во время выполнения, когда начинается резервное копирование базы данных на C#
    Anonymous » » в форуме C#
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Запустите две асинхронные задачи параллельно и собирайте результаты .NET 4.5
    Anonymous » » в форуме C#
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Запустите две асинхронные задачи параллельно и собирайте результаты .NET 4.5
    Anonymous » » в форуме C#
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous

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