folder Tahribat.com Forumları
linefolder C#, Asp.Net, .Net Core
linefolder C# Eş Zamanlı Dosya İndirme Sorunu...



C# Eş Zamanlı Dosya İndirme Sorunu...

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    DuPi
    DuPi's avatar
    Kayıt Tarihi: 21/Ağustos/2005
    Erkek

    Merhaba arkadaşlar,

    C#'ta bir patcher yapıyorum. verdiğim xml dosyasındaki tüm <dosya>url</dosya> etiketlerindeki dosyaları indiriyor. fakat sorun şu

     

    foreach(NodeList node in nodeListarr)

    {

    string url = node["url"];

     

       downloadFile(url,"localdizin/dosya...");

    }

     

    foreach döngüsü downloadı başlatıyor. fakat bitmeden 2. 3. 4. downloadı da başlatıyor.

    yani sırası ile indirme olayı olmuyor.

    downloadFile fonksiyonu void tipinde. download bitene kadar döngü bekletilemez mi? çözüm önerilerinizi alabilirmiyim.


    Ne zaman birşey öğrenmek istesem, Birden Vaktim Kalmıyor ?
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    MadJack
    MadJack's avatar
    Kayıt Tarihi: 07/Temmuz/2014
    Erkek

    Tahmin yürütüyorum, dosya indirme işlemi sorunsuzca başladığı anda methoda olumlu dönüş yapılıyor ve döngü devam ediyor olabilir. Yani indirme işlemi bitti mi, yarıda mı kesildi gibi geri dönüşleri olmayabilir kullandığın methodun. Doğal olarak zaten senkron çalıştığı için indirmenin tamamlanıp tamamlanmadığını kontrol etmiyordur method.

    Eğer bu tahmin ettiğim mantıkla çalışıyorsa biraz amelelik olacak ama şöyle birşey yapılabilir; yazdığın foreach döngüsünün içinde methodu çağırdıktan sonra sürekli indirilen dosyanın boyutunu kontrol et while ile. beklenen değerin üstüne çıkınca while'dan çıkıp foreach'a devam et.


    Everyone sees just what they want to see.
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    DuPi
    DuPi's avatar
    Kayıt Tarihi: 21/Ağustos/2005
    Erkek

    hah paşam işte bu cevabı bekliyordum :)

    pc bende değil. DownloadComplete metodunu kontrol edebiliyorum.

    aslında sormam gereken soru şuydu. foreach döngüsünde. boolean tipinde x fonksiyonu çalıştığında geri dönüş yapması beklenir mi gibi. olmalıydı. akşam bunu deneyecem...

    while(!downloadcomplete)

    {

     Thread.Sleep(100);

    }

    -------------------------------------------------

    Peki şöyle bir soru sorayım. 

    senkron'a limit veya sıra verilebilir mi?

    mesela 100 adet dosya download yapacam. foreach başladı. sekron olduğu için 100 taneyi kısa sürede tamamlayacak.

    ama o 100 adet indirme başlatacak mı? yoksa maks bağlantı atıyorum 20'dir o yirmiden 1 bitince 19+1 şeklinde indirme yapacak mı?


    Ne zaman birşey öğrenmek istesem, Birden Vaktim Kalmıyor ?
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    MadJack
    MadJack's avatar
    Kayıt Tarihi: 07/Temmuz/2014
    Erkek

    sormak istediğini tam olarak anlayamadım hocam


    Everyone sees just what they want to see.
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    DuPi
    DuPi's avatar
    Kayıt Tarihi: 21/Ağustos/2005
    Erkek

    IDM İle 20 tane dosya indirdiğinde kuyruk yapıyor ya,

    3 tanesi başlıyor diğerleri beklemede, bittikçe sıradaki indiriliyor. onu soruyorum. 

    senkron otomatik o işlemi yapıyor mu?


    Ne zaman birşey öğrenmek istesem, Birden Vaktim Kalmıyor ?
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    TeRRoR
    TeRRoR's avatar
    Kayıt Tarihi: 06/Nisan/2007
    Erkek

    Hocam downloadfile methodunun içindeki kodlarıda gösterebilirmisin. şuanda yazdığın kod multithread yada asenkron değil. bu yüzden download bitene kadar downloadFile methodunda kod takılı kalması gerekiyor. eğer kodun asenkron yada multithread değilse ama çatara çutara diğer dosyaları indirmeye çalışıyorsa büyük ihtimalle bir exception oluşuyordur.


    herkes programcı olmak zorunda değildir, lütfen bir zorunluluk gibi programlama dilleri öğrenmeye çalışmayın. yabancı dil filan öğrenin amq.// s.kimin etini yerim, kasaba minnet etmem.// ince düşünene kalın girer.//
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    DuPi
    DuPi's avatar
    Kayıt Tarihi: 21/Ağustos/2005
    Erkek

     

            public void DownloadFile(string urlAddress, string location)

            {

                using (webClient = new WebClient())

                {

                    webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);

                    webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);

                    Uri URL = urlAddress.StartsWith("http://", StringComparison.OrdinalIgnoreCase) ? new Uri(urlAddress) : new Uri("http://" + urlAddress);

                    sw.Start();

                    try

                    {

                      webClient.DownloadFileAsync(URL, location);

                     //  webClient.DownloadFile(URL, location);

                    }

                    catch (Exception ex)

                    {

                        MessageBox.Show(ex.Message);

                    }

     

                }

            }


    Ne zaman birşey öğrenmek istesem, Birden Vaktim Kalmıyor ?
  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    YekteranBaymedir
    YekteranBaymedir's avatar
    Kayıt Tarihi: 10/Temmuz/2009
    Homo
    DuPi bunu yazdı

    IDM İle 20 tane dosya indirdiğinde kuyruk yapıyor ya,

    3 tanesi başlıyor diğerleri beklemede, bittikçe sıradaki indiriliyor. onu soruyorum. 

    senkron otomatik o işlemi yapıyor mu?

    pythonda thread ve queue modüllerini kullanıyorum

    ben sıraya diziyorum linkleri

    bir threadin işi bittiğinde diğerine geçiyor

    c#'de de mutlaka vardır

    araman gereken kelimeler Thread Pool

  9. KısayolKısayol reportŞikayet pmÖzel Mesaj
  10. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Tarikat Şeyhi
    HolyOne
    HolyOne's avatar
    Kayıt Tarihi: 01/Haziran/2002
    Erkek

    Çok sayıda aynı anda indirmeye ihtiyacın yoksa threade, backgroundworkera girmeden parallel for olayına bak.


    Nush ile uslanmayanı etmeli tekdir, Tekdir ile uslanmayanın hakkı kötektir!
  11. KısayolKısayol reportŞikayet pmÖzel Mesaj
    DuPi
    DuPi's avatar
    Kayıt Tarihi: 21/Ağustos/2005
    Erkek

    Olayı çözdüm.

     EDİT : Çözüm..

    private void metin2PackKontrol()
            {
                XmlDocument xmlDosya = new XmlDocument();
                xmlDosya.Load(@"_tmp.dxs");
                XmlNodeList xmlnode = xmlDosya.GetElementsByTagName("patch");
                foreach (XmlNode eleman in xmlnode)
                {
                    string dosyaadi = eleman["dosyaadi"].InnerText;
                    string dizin = eleman["dizin"].InnerText;
                    string url = eleman["url"].InnerText;
                    string hash = eleman["hash"].InnerText;
                    if (!Directory.Exists(pYolu+dizin))
                    {
                        Directory.CreateDirectory(pYolu+dizin);
                    }
                    if ((dp.getMd5Hash(dizin + "\\" + dosyaadi) != hash) || (!File.Exists(dizin + "\\" + dosyaadi)))
                    {
                        lblName.Text = "Download : " + dosyaadi;
                       DownloadFile(url,dizin+"\\"+dosyaadi);
                       while (durum)
                       {
                          Application.DoEvents();
                       }
                       durum = true;
                    }
                    
                
                }
               
            }
    

    Olay while döngüsünde bitiyor.

    foreach döngüsü while den çıkmadığı sürece program bekliyor. downloadComplete olduğunda durum = false; yapıp çıkıyorum. 

    hemen ardından durum'u tekrar true yapıyorum ki :) yine beklesin.  yardımcı olan arkadaşlara çok teşekkürler.

    Ayrıca aynı konuyu CW'ye açmıştım. bu saat oldu cevap veren yok :/ işte tbt farkı burdan belli oluyor.

    DuPi tarafından 16/Ara/14 11:43 tarihinde düzenlenmiştir

    Ne zaman birşey öğrenmek istesem, Birden Vaktim Kalmıyor ?
Toplam Hit: 1861 Toplam Mesaj: 13