Affären som ska göras är att ladda ner nästan 40 000 ljudbitar från Alibaba Cloud till lokalområdet, och en enda nedladdning är mycket långsam, så jag vill använda multitrådning och allokera 20 trådar för att ladda ner samtidigt, vilket sparar mycket tid Klassprogram {
statiskt tomrum Main(string[] args) { sträng sql = "välj en_audio,us_audio från t_audio LIMIT 198 "; MySqlDataReader mySqlDataReader = DBHelper.ExecuteReader(sql); List<String> sList = ny 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) { medan (mySqlDataReader.Read()) { sList.Add(mySqlDataReader.GetString(0)); sList.Add(mySqlDataReader.GetString(1)); } } Console.WriteLine(sList.Count); Stoppur = ny stoppur (stoppur); Stoppur. Start(); ThreadStart(sList); WaitHandle.WaitAll(waits); Alla trådar i lyssna-väntan har ställts in innan följande kod exekveras, annars väntar de här Stoppur. Stop(); Console.WriteLine($"Tidskrävande{stopwatch. FörflutnaMillisekunder}millisekunder"); Console.ReadKey();
} statisk tråd[] trådar = ny tråd[20]; statisk WaitHandle[] waits = ny WaitHandle[20]; publik statisk void ThreadStart(List<String> nums) { Tilldela trådar för (int i=0; I<20; i++) { threads[i] = ny tråd(DownLoadFile); waits[i] = ny AutoResetEvent(false);
} Tilldela data till varje tråd för att köra och starta exekveringen för (int i = 0; Jag < 20; i++) { om (i== trådar. Längd-1) { var retult = nums. Skip(nums. Count / 20 * i). Ta (nums. Räkna-nums. Count / 20*i). ToList(); trådar[i]. Start(ny Objpt() { sList = retult, WaitHandle = waits[i], ThreadIndex = i }); } annars { var retult= nums. Skip(nums. Count / 20 * i). Ta (nums. Count / 20). ToList(); trådar[i]. Start(new Objpt() { sList= retult, WaitHandle=waits[i], ThreadIndex=i }); }
} }
offentlig statisk void DownLoadFile(Objekt obj) { Int count = 0; Objpt optObj = (obj som Objpt); var sList = optObj.sList; Console.WriteLine($"Thread{optObj.ThreadIndex} startade"; foreach (var url i sList) { Försök { räkning++; var arrs = URL. Split('/'); WebRequest-begäran = WebRequest.Create(url); HttpWebResponse res = (HttpWebResponse)-begäran. GetResponse(); WebResponse svar = begäran. GetResponse(); om (res. StatusCode.ToString() == "OK") { Stream responseStream = response. GetResponseStream(); using (FileStream fsWrite = new FileStream($"F:/Audio/v4/{arrs[arrs. Längd - 2]}/{arrs[arrs. Length - 1]}", FileMode.OpenOrCreate, FileAccess.Write)) { byte[] buffer = ny byte[response. InnehållLängd]; medan (sann) { Returnerar antalet byte som faktiskt lästes denna gång int r = responseStream.Read(buffer, 0, buffer. längd); om (r == 0) { paus; } fsWrite.Write(buffer, 0, r); skriv
} } } om (räkna % 20 == 0 || räkna == sList.Räkna) //{ Console.WriteLine($"Thread{optObj.ThreadIndex} processed:{count}"); //}
} catch (Undantag t.ex.) { sträng strErrorLogFile = System.AppDomain.CurrentDomain.BaseDirectory + $"\\{optObj.ThreadIndex}ErrorLog.log"; om (! System.IO.File.Exists(strErrorLogFile)) System.IO.File.WriteAllText(strErrorLogFile, "//System ErrorLog File\r\n"); object objSql = "thread" + optObj.ThreadIndex.ToString() + ex. Meddelande; 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} slutar"); (optObj.WaitHandle som AutoResetEvent). Set(); Set-metoden är att markera när en tråd slutar } }
public class Objpt { publik List<String> sList { get; set; } public WaitHandle WaitHandle { get; set; } publik int ThreadIndex { get; set; }
}
|