Úlohou je stiahnuť takmer 40 000 kusov zvuku z Alibaba Cloud do lokálnej oblasti, pričom jedno stiahnutie je veľmi pomalé, preto chcem použiť viacvláknové spracovanie a prideliť 20 vlákien na stiahnutie naraz, čím ušetrím veľa času Triedny program {
static void Main(string[] args) { string sql = "select en_audio,us_audio z t_audio LIMIT 198 "; MySqlDataReader mySqlDataReader = DBHelper.ExecuteReader(sql); List<String> sList = nový 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); Stopky = nové Stopky(); Stopky. Start(); ThreadStart(sList); WaitHandle.WaitAll(čaká); Všetky vlákna v čakacej fáze počúvania boli nastavené pred vykonaním nasledujúceho kódu, inak budú čakať tu Stopky. Stop(); Console.WriteLine($"Časovo náročné{stopky. ElapsedMilliseconds}milisekundy"); Console.ReadKey();
} statické vlákna[] = nové vlákna[20]; statický WaitHandle[] čaká = nový WaitHandle[20]; public static void ThreadStart(List<String> nums) { Priraď vlákna pre (int i=0; i<20; i++) { threads[i] = nový Thread(DownLoadFile); waits[i] = nový AutoResetEvent(false);
} Priraďte dáta ku každému vláknu na vykonanie a spustenie vykonávania pre (int i = 0; Mám < 20; i++) { ak (i== vlákna. Dĺžka-1) { var retult = nums. Preskoč (nums. Počítaj / 20 * i). Vezmi si (nums. Count- nums. Count / 20*i). ToList(); threads[i]. Štart(nový Objpt() { sList = retult, WaitHandle = čaká[i], ThreadIndex = i }); } else { var retult= nums. Preskoč (nums. Počítaj / 20 * i). Vezmi si (nums. Count / 20). ToList(); threads[i]. Start(new Objpt() { sList= retult, WaitHandle=čaká[i], ThreadIndex=i }); }
} }
public static void DownLoadFile(Object obj) { počet int = 0; Objpt optObj = (obj ako Objpt); var sList = optObj.sList; Console.WriteLine($"Thread{optObj.ThreadIndex} started"; foreach (var url v sList) { Skús { count++; var arrs = URL. Split('/'); WebRequest request = WebRequest.Create(url); HttpWebResponse res = (HttpWebResponse) požiadavka. GetResponse(); WebResponse response = žiadosť. GetResponse(); ak (res. StatusCode.ToString() == "OK") { Stream responseStream = response. GetResponseStream(); používajúc (FileStream fsWrite = nový FileStream($"F:/Audio/v4/{arrs[arrs. Dĺžka - 2]}/{arrs[arrs. Dĺžka - 1]}", FileMode.OpenOrCreate, FileAccess.Write)) { byte[] buffer = nový bajt[odpoveď. ContentLength]; zatiaľ čo (pravda) { Vráti počet skutočne prečítaných bajtov tentoraz int r = responseStream.Read(buffer, 0, buffer. Dĺžka); ak (r == 0) { prestávka; } fsWrite.Write(buffer, 0, r); píš
} } } ak (count % 20 == 0 || count == sList.Count) //{ Console.WriteLine($"Thread{optObj.ThreadIndex} processed:{count}"); //}
} chytiť (Výnimka ex) { string strErrorLogFile = System.AppDomain.CurrentDomain.BaseDirectory + $"\\{optObj.ThreadIndex}ErrorLog.log"; ak (! System.IO.File.Exists(strErrorLogFile)) System.IO.File.WriteAllText(strErrorLogFile, "//System ErrorLog File\r\n"); object objSql = "thread" + optObj.ThreadIndex.ToString() + ex. Správa; 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 ako AutoResetEvent). set(); metóda set je označiť, kedy vlákno končí } }
public class Objpt { public List<String> sList { get; set; } public WaitHandle WaitHandle { get; set; } public int ThreadIndex { get; set; }
}
|