• 22-05-2014, 00:06:56
    #1
    c# form uygulamasında aynı anda birden fazla dosya indirmeye çalışıyorum. Aşağıdaki kod biri bittikten sonra diğeri başlayarak indirme yapıyor. Aynı anda birden fazla indirme yapmak için ne yapabilirim?

    private void btnStartDownload_Click(object sender, EventArgs e)
    {
        WebClient client = new WebClient();
        client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
        client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);
        
        // Starts the download
        client.DownloadFileAsync(new Uri("SomeURLToFile"), "SomePlaceOnLocalHardDrive");
    
        btnStartDownload.Text = "Download In Process";
        btnStartDownload.Enabled = false;
    }
    void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
    {
        double bytesIn = double.Parse(e.BytesReceived.ToString());
        double totalBytes = double.Parse(e.TotalBytesToReceive.ToString());
        double percentage = bytesIn / totalBytes * 100;
    
        progressBar1.Value = int.Parse(Math.Truncate(percentage).ToString());
    }
    void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
    {
        MessageBox.Show("Download Completed");
    
        btnStartDownload.Text = "Start Download";
        btnStartDownload.Enabled = true;
    }
  • 22-05-2014, 01:31:03
    #2
    Kimlik doğrulama veya yönetimden onay bekliyor.
    MultiThread kullanman gerek.
    Edit: İlk verdiğim kod hatalı, web'e gitti aklım. Ertanın yolunu kullanabilirsin.
  • 22-05-2014, 01:37:54
    #3
    ş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
  • 22-05-2014, 10:35:13
    #4
    @ertan2002; dediğiniz mantıkla giderek multi indirmeyi başardım, teşekkürler. Ama şimdi bunları duraklatma, durmuşsa devam ettirme bir de iptal etme seçeneklerini yapıyorum.

    private void btnPause_Click(object sender, EventArgs e)
            {
                if (t1.IsAlive)
                    t1.Suspend();
                if (t2.IsAlive)
                    t2.Suspend();
            }
    break pointle kontrol ettiğimde t1 is.alive olarak hiçbir zaman görünmüyor yani durdurmuyor threadi. Durdurmak için nasıl bir yöntem izleyebilirim?
  • 22-05-2014, 11:43:50
    #5
    webclient download metodları asenkron çalıştığı için durduramazsın, onun yerine httpweb request kullanman gerekiyor..


    bu sayfada verilen örnek kodlara ya da projelere bak

    http://stackoverflow.com/questions/1...-my-downloader

    mantık gayet basit, indirilirken while döngüsü içerisinde yine bir while döngüsü ve bir değişken ile kontrol ediyorlar, eğer içerik true ise (bu değeri pause metodunda atıyorlar) döngüden çıkmıyor ve dosyayı indirmiyor, bu işlem, o değişkeni false yapana kadar (resume metodu içinde değiştiriliyor), devam ediyor, değişken false olduğunda indirme işlemine devam ediyor..