şuan deneme şansım yok, kafadan yazıyorum.. mantığını anlarsan çözersin eğer bir sıkıntı olursa

  WebClient client;

 //formun ismini Form1 olarak varsayıyorum..
   public Form1()
    {
        InitializeComponent();
     client = new WebClient();
    client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
    client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);

    }


private void btnStartDownload_Click(object sender, EventArgs e)
{

   var link1 = new PrivateLink("indirilecek dosya linki 1 ", "kaydedileceği konum ve dosyadı 1" );
   
   var link2 = new PrivateLink("indirilecek dosya linki 2 ", "kaydedileceği konum ve dosyadı 2");
    

    ThreadPool.QueueUserWorkItem(new WaitCallback(download), link1);
    ThreadPool.QueueUserWorkItem(new WaitCallback(download), link2);

    btnStartDownload.Text = "Download In Process";
    btnStartDownload.Enabled = false;
}


void download(object fileInfo)
{

  PrivateLink link = fileInfo as PrivateLink;

    
    // Starts the download
    client.DownloadFileAsync(new Uri(link.fileUrl),link.locationPath);


}

ayrı bir sınıf yap
public class PrivateLink()
{

public void PrivateLink(string fileUrl, string locationPath)
{
   this.fileUrl = fileUrl;
  this.locationPath = locationPath;
}

public string fileUrl {get;set;}
public string locationPath {get;set;}


}

kalan şeylerde yazdığın kodları kullan.. bu şekilde çalışması gerekiyor.. ne yaptığıma gelince, her download işini havuzdaki bir iş parçacağına (thread) e yükledim..

download fonksiyonu içinde client da thread çakışabilir, bunun için bir delegate ya da action kullanmak gerekebilir ya da lock kullanacaksın.. bi dene de bakarız ona uygun çözüm..

kolay gelsin