Is there a simple way to create a low priority transfer of a file? I have many files on my server and sometimes i am transferring other things too. Is there an easy way i can make my application transfer slowly when my network is busy?
+1
A:
Use WebClient.OpenRead
and add some sleeps in the middle of reading the response. Something along these lines:
using(var client = new WebClient())
using(var input = client.OpenRead("http://whatever.com/myfile.txt"))
using(var output = File.OpenWrite("c:/temp/myfile.txt"))
{
var length = long.Parse(client.ResponseHeaders["content-length"]);
var buffer = new byte[32768];
long totalRead = 0;
while(totalRead < length)
{
int read = input.Read(buffer, 0, buffer.Length);
if (read != 0)
{
output.Write(buffer, 0, read);
totalRead += read;
}
Thread.Sleep(100); // This is what slows down the download, make number bigger to download slower
}
}
Sam
2010-02-10 04:43:41
+3
A:
Check out BITS. Here's a quick example to transfer as low priority:
using (var done = new EventWaitHandle(false, EventResetMode.ManualReset))
{
var manager = new Manager();
var job = manager.CreateJob("Test Job Name");
var jobevents = new JobEvents();
job.AddFile(
@"F:\DEV\TestBITS\TestBITS\dotnetfx35.exe",
"http://download.microsoft.com/download/2/0/e/20e90413-712f-438c-988e-fdaa79a8ac3d/dotnetfx35.exe");
job.Priority = JobPriority.Low;
jobevents.JobTransferred += (sender, e) => { e.Job.Complete(); done.Set(); };
jobevents.JobError += (sender, e) => { e.Job.Cancel(); done.Set(); };
jobevents.AddJob(job);
job.ResumeJob();
done.WaitOne();
}
Jesse C. Slicer
2010-02-10 04:45:45