Tehtävänä on ladata lähes 40 000 äänikappaletta Alibaba Cloudista paikalliselle alueelle, ja yksi lataus on hyvin hidasta, joten haluan käyttää monisäikeistä ja varata 20 säikettä ladattavaksi samanaikaisesti, säästäen paljon aikaa luokkaohjelma {
staattinen void Main(string[] args) { string sql = "valitse en_audio,us_audio t_audio LIMIT 198:sta"; MySqlDataReader mySqlDataReader = DBHelper.ExecuteReader(sql); List<String> sList = uusi 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) { kun (mySqlDataReader.Read()) { sList.Add(mySqlDataReader.GetString(0)); sList.Add(mySqlDataReader.GetString(1)); } } Console.WriteLine(sList.Count); Sekuntikello sekuntikello = uusi Sekuntikello(); Sekuntikello. Start(); ThreadStart(sList); WaitHandle.WaitAll(odottaa); Kaikki kuuntelujonon säikeet on asetettu ennen seuraavan koodin suorittamista, muuten ne odottavat täällä Sekuntikello. Stop(); Console.WriteLine($"Time-condoming{stopwatch. EpassdMilliseconds}milliseconds"); Console.ReadKey();
} staattinen Thread[] threads = uusi Thread[20]; staattinen WaitHandle[] waits = uusi WaitHandle[20]; public static void ThreadStart(List<String> nums) { Säikeiden määrittäminen for (int i=0; i<20; i++) { threads[i] = uusi Thread(DownLoadFile); odottaa[i] = uusi AutoResetEvent(väärin);
} Määritä tiedot jokaiselle säikeelle suoritettavaksi ja aloitetaan suoritus kun (int i = 0; Olen < 20; i++) { jos (i== säikeet. Pituus-1) { var retult = nums. Skip(nums. Laske / 20 * i). Ota (nums. Lukumäärät. Count / 20*i). ToList(); Threads[i]. Start(new Objpt() { sList = retult, WaitHandle = odottaa[i], ThreadIndex = i }); } else { var retult= nums. Skip(nums. Laske / 20 * i). Ota (nums. Count / 20). ToList(); Threads[i]. Start(new Objpt() { sList= retult, WaitHandle=odottaa[i], ThreadIndex=i }); }
} }
public static void DownLoadFile(Object obj) { int määrä = 0; Objpt optObj = (obj muodossa Objpt); var sList = optObj.sList; Console.WriteLine($"Thread{optObj.ThreadIndex} started"; foreach (var url in sList) { yritä { count++; VAR arrs = URL. Split('/'); WebRequest-pyyntö = WebRequest.Create(url); HttpWebResponse res = (HttpWebResponse)pyyntö. GetResponse(); WebResponse-vastaus = pyyntö. GetResponse(); if (resoluutio. StatusCode.ToString() == "OK") { Stream responseStream = vastaus. GetResponseStream(); käyttäen (FileStream fsWrite = new FileStream($"F:/Audio/v4/{arrs[arrs. Pituus - 2]}/{arrs[arrs. Pituus - 1]}", FileMode.OpenOrCreate, FileAccess.Write)) { tavu[] puskuri = uusi tavu[vastaus. ContentLength]; kun (totta) { Palauttaa tällä kertaa oikeasti luettujen tavujen määrän int r = responseStream.Read(buffer, 0, buffer. Pituus); jos (r == 0) { tauko; } fsWrite.Write(puskuri, 0, r); kirjoita
} } } if (count % 20 == 0 || count == sList.Count) //{ Console.WriteLine($"Thread{optObj.ThreadIndex} processed:{count}"); //}
} catch (poikkeus esim.) { string strErrorLogFile = System.AppDomain.CurrentDomain.BaseDirectory + $"\\{optObj.ThreadIndex}ErrorLog.log"; jos (! System.IO.File.Exists(strErrorLogFile)) System.IO.File.WriteAllText(strErrorLogFile, "//System ErrorLog File\r\n"); object objSql = "thread" + optObj.ThreadIndex.ToString() + ex. Viesti; 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} päättyy"); (optObj.WaitHandle as AutoResetEvent). Set(); Set-menetelmä on merkitä, milloin säie päättyy } }
public class Objpt { public List<String> sList { get; setti; } public WaitHandle WaitHandle { get; setti; } public int ThreadIndex { get; setti; }
}
|