C# Eş Zamanlı Dosya İndirme Sorunu...
-
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.
-
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.
-
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ı?
-
sormak istediğini tam olarak anlayamadım hocam
-
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?
-
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.
-
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);
}
}
}
-
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
-
Terror'un dediği gibi asenkron ve ve paralel işlemler yaptır.
MSDN'deki örnekleri de incelemeni tavsiye ederim;
http://msdn.microsoft.com/en-us/library/hh191443.aspx
Anahtar kelimeler: DownloadFileTaskAsync ForEachAsync
ZINDIK tarafından 15/Ara/14 21:40 tarihinde düzenlenmiştir -
Çok sayıda aynı anda indirmeye ihtiyacın yoksa threade, backgroundworkera girmeden parallel for olayına bak.
-
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