De taak die uitgevoerd moet worden is om bijna 40.000 audiostukken van Alibaba Cloud naar het lokale gebied te downloaden, en één enkele download is erg traag, dus ik wil multithreading gebruiken en 20 threads tegelijk toewijzen om te downloaden, wat veel tijd bespaart Klasprogramma {
statische void Main(string[] args) { string sql = "selecteer en_audio,us_audio uit t_audio LIMIET 198 "; MySqlDataReader mySqlDataReader = DBHelper.ExecuteReader(sql); List<String> sList = nieuwe 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) { terwijl (mySqlDataReader.Read()) { sList.Add(mySqlDataReader.GetString(0)); sList.Add(mySqlDataReader.GetString(1)); } } Console.WriteLine(sList.Count); Stopwatch stopwatch = nieuwe stopwatch(); Stopwatch. Start(); ThreadStart(sList); WaitHandle.WaitAll(wacht); Alle threads in de luisterwacht zijn ingesteld voordat de volgende code wordt uitgevoerd, anders wachten ze hier Stopwatch. Stop(); Console.WriteLine($"Time-uping{stopwatch. VerstrekenMilliseconden}milliseconden"); Console.ReadKey();
} statische Thread[] threads = nieuwe Thread[20]; statisch WaitHandle[] waits = nieuwe WaitHandle[20]; publieke statische void ThreadStart(List<String> nums) { Draden toewijzen voor (int i=0; i<20; i++) { threads[i] = nieuwe Thread(DownLoadFile); waits[i] = nieuwe AutoResetEvent(false);
} Wijs data toe aan elke thread om uit te voeren en start de uitvoering voor (int i = 0; Ik < 20; i++) { als (i== draden. Lengte-1) { var retult = nums. Skip(nums. Tel / 20 * i). Take(nums. Tellen- nums. Tel / 20*i). ToList(); threads[i]. Start(nieuwe Objpt() { sList = retult, WaitHandle = waits[i], ThreadIndex = i }); } anders { var retult= nums. Skip(nums. Tel / 20 * i). Take(nums. Tel / 20). ToList(); threads[i]. Start(new Objpt() { sList= retult, WaitHandle=waits[i], ThreadIndex=i }); }
} }
publieke statische void DownLoadFile(Object obj) { int count = 0; Objpt optObj = (obj als Objpt); var sList = optObj.sList; Console.WriteLine($"Thread{optObj.ThreadIndex} begonnen"; foreach (var url in sList) { Probeer het { tellen++; var arrs = url. Split('/'); WebRequest-verzoek = WebRequest.Create(url); HttpWebResponse res = (HttpWebResponse)verzoek. GetResponse(); WebResponse response = verzoek. GetResponse(); als (Weerstand. StatusCode.ToString() == "OK") { Stream responseStream = response. GetResponseStream(); gebruikmakend van (FileStream fsWrite = nieuwe FileStream($"F:/Audio/v4/{arrs[arrs. Lengte - 2]}/{arrs[arrs. Lengte - 1]}", FileMode.OpenOrCreate, FileAccess.Write)) { byte[] buffer = nieuwe byte[response. ContentLengte]; terwijl (waar) { Geeft het aantal bytes dat deze keer daadwerkelijk is gelezen terug. int r = responseStream.Read(buffer, 0, buffer. Lengte); als (r == 0) { pauze; } fsWrite.Write(buffer, 0, r); schrijf
} } } als (count % 20 == 0 || count == sList.Count) //{ Console.WriteLine($"Thread{optObj.ThreadIndex} verwerkt:{count}"); //}
} vangen (Uitzondering bijv.) { string strErrorLogFile = System.AppDomain.CurrentDomain.BaseDirectory + $"\\{optObj.ThreadIndex}ErrorLog.log"; als (! System.IO.File.Exists(strErrorLogFile)) System.IO.File.WriteAllText(strErrorLogFile, "//System ErrorLog File\r\n"); object objSql = "thread" + optObj.ThreadIndex.ToString() + ex. Bericht; 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} eindigt"); (optObj.WaitHandle als AutoResetEvent). Set(); De setmethode is om te markeren wanneer een thread eindigt } }
publieke klasse Objpt { publieke List<String> sList { get; set; } public WaitHandle WaitHandle { get; set; } publieke int ThreadIndex { get; set; }
}
|