Возможно, это из-за пула потоков исчерпание ниток? Любые рекомендации по дальнейшему устранению этой неполадки.
Ниже приведен мой код.
Код: Выделить всё
// 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