tags:

views:

38

answers:

2

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
+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