public async Task DownloadWithThrottlingAsync(string url, string filePath, int maxBytesPerSecond)
{
using var httpClient = new HttpClient();
using var response = await httpClient.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
await using var contentStream = await response.Content.ReadAsStreamAsync();
await using var fileStream = new FileStream(filePath, FileMode.Create);
var buffer = new byte[8192];
var stopwatch = Stopwatch.StartNew();
long totalBytesRead = 0;
int bytesRead;
while ((bytesRead = await contentStream.ReadAsync(buffer, 0, buffer.Length)) > 0)
{
await fileStream.WriteAsync(buffer, 0, bytesRead);
totalBytesRead += bytesRead;
if (maxBytesPerSecond > 0)
{
var elapsed = stopwatch.Elapsed.TotalSeconds;
var targetTime = (double)totalBytesRead / maxBytesPerSecond;
if (elapsed < targetTime)
{
var delayTime = (targetTime - elapsed) * 1000;
await Task.Delay(TimeSpan.FromMilliseconds(delayTime));
}
}
}
}