Yapılacak iş, Alibaba Cloud'dan yerel bölgeye yaklaşık 40.000 ses indirmek, tek bir indirme ise çok yavaş, bu yüzden çoklu iş zinciri kullanmak ve aynı anda 20 iş parçacığını indirmek istiyorum, böylece çok zaman kazandırıyorum Sınıf Programı {
statik boşluk Main(string[] args) { string sql = "t_audio LIMIT 198'den en_audio,us_audio seç"; MySqlDataReader mySqlDataReader = DBHelper.ExecuteReader(sql); List<String> sList = yeni List<String>(); sList.Add("https://qutifen-qudao.oss-cn-beijing.aliyuncs.com/mfg/audio/v3/1abacus_en.ogg"); sList.Add("https://qutifen-qudao.oss-cn-beijing.aliyuncs.com/mfg/audio/v3/2abacus_en.ogg"); if (mySqlDataReader.HasRows) { while (mySqlDataReader.Read()) { sList.Add(mySqlDataReader.GetString(0)); sList.Add(mySqlDataReader.GetString(1)); } } Console.WriteLine(sList.Count); Kronometre kronometresi = yeni Kronometre(); kronometre. Start(); ThreadStart(sList); WaitHandle.WaitAll(bekliyor); Dinleme bekleme içindeki tüm iş parçacıkları aşağıdaki kodu çalıştırmadan önce ayarlanmıştır, aksi takdirde burada beklerler kronometre. Dur(); Console.WriteLine($"Time-consuming{stopwatch. GeçmişMilisaniye}milisaniye"); Console.ReadKey();
} statik Thread[] threads = yeni Thread[20]; statik WaitHandle[] waits = yeni WaitHandle[20]; public static void ThreadStart(List<String> nums) { İş parçacıkları atama için (int i=0; i<20; i++) { threads[i] = yeni Thread(DownLoadFile); waits[i] = yeni AutoResetEvent(yanlış);
} Her iş parçacığına veri atanarak çalıştırın ve çalıştırmaya başlayın için (int i = 0; 20 <; i++) { eğer (i== threads. Uzunluk-1) { var retult = nums. Skip(nums. Sayı / 20 * i). Al (nums. Sayı-sayılar. Sayı / 20*i). ToList(); iplikler[i]. Start(new Objpt() { sList = retult, WaitHandle = waits[i], ThreadIndex = i }); } else { var retult= nums. Skip(nums. Sayı / 20 * i). Al (nums. Sayı / 20). ToList(); iplikler[i]. Start(new Objpt() { sList= retult, WaitHandle=waits[i], ThreadIndex=i }); }
} }
public static void DownLoadFile(Object obj) { int sayısı = 0; Objpt optObj = (obj olarak Objpt); var sList = optObj.sList; Console.WriteLine($"Thread{optObj.ThreadIndex} started"; foreach (var url in sList) { Denemek { say++; var arrs = URL. Split('/'); WebRequest request = WebRequest.Create(url); HttpWebResponse res = (HttpWebResponse)request. GetResponse(); WebResponse yanıtı = istek. GetResponse(); if (çözünürlük. StatusCode.ToString() == "OK") { Akış yanıtıStream = yanıt. GetResponseStream(); (FileStream fsWrite = yeni FileStream($"F:/Audio/v4/{arrs[arrs. Uzunluk - 2]}/{arrs[arrs. Uzunluk - 1]}", FileMode.OpenOrCreate, FileAccess.Write)) { byte[] buffer = yeni bayt[yanıt. ContentLength]; Doğrudur { Bu sefer gerçekten okunan bayt sayısını döndürür int r = responseStream.Read(buffer, 0, buffer. Uzunluk); eğer (r == 0) { mola; } fsWrite.Write(buffer, 0, r); yaz
} } } if (say % 20 == 0 || count == sList.Count) //{ Console.WriteLine($"Thread{optObj.ThreadIndex} processed:{count}"); //}
} catch (İstisna örneğin) { string strErrorLogFile = System.AppDomain.CurrentDomain.BaseDirectory + $"\\{optObj.ThreadIndex}ErrorLog.log"; if (! System.IO.File.Exists(strErrorLogFile)) System.IO.File.WriteAllText(strErrorLogFile, "//System ErrorLog File\r\n"); object objSql = "thread" + optObj.ThreadIndex.ToString() + ex. İleti; System.IO.File.AppendAllText(strErrorLogFile, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\t" + objSql.ToString() + url + "\r\n");
}
} Console.WriteLine($"Thread{optObj.ThreadIndex} ends"); (optObj.WaitHandle as AutoResetEvent). Set(); Set yöntemi, bir iplik bittiğinde işaretlemektir } }
public class Objpt { public List<String> sList { get; set; } public WaitHandle WaitHandle { get; set; } public int ThreadIndex { get; set; }
}
|