Forretningen, der skal udføres, er at downloade næsten 40.000 lydstykker fra Alibaba Cloud til lokalområdet, og en enkelt download er meget langsom, så jeg vil bruge multitrådning og tildele 20 tråde til download samtidig, hvilket sparer meget tid klasseprogram {
statisk void Main(string[] args) { streng sql = "vælg en_audio,us_audio fra 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"); hvis (mySqlDataReader.HasRows) { mens (mySqlDataReader.Read()) { sList.Add(mySqlDataReader.GetString(0)); sList.Add(mySqlDataReader.GetString(1)); } } Console.WriteLine(sList.Count); Stopur stopur = nyt stopur(); Stopur. Start(); ThreadStart(sList); WaitHandle.WaitAll(waits); Alle tråde i listen wait er sat før den følgende kode kan eksekveres, ellers vil de vente her Stopur. Stop(); Console.WriteLine($"Time-uping{stopwatch. ElapsedMilliseconds}milliseconds"); Console.ReadKey();
} statisk Tråd[] tråde = ny Tråd[20]; statisk WaitHandle[] waits = ny WaitHandle[20]; offentlig statisk void ThreadStart(List<String> nums) { Tildel tråde for (int i=0; i<20; i++) { threads[i] = ny tråd(DownLoadFile); waits[i] = ny AutoResetEvent(falsk);
} Tildel data til hver tråd for at udføre og starte eksekveringen for (int i = 0; Jeg < 20; i++) { hvis (i== tråde. Længde-1) { var retult = nums. Skip(nums. Tæl / 20 * i). Tag(nums. Tæl-nums. Count / 20*i). ToList(); tråde[i]. Start(ny Objpt() { sList = retult, WaitHandle = waits[i], ThreadIndex = i }); } ellers { var retult= nums. Skip(nums. Tæl / 20 * i). Tag(nums. Tæl / 20). ToList(); tråde[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} startede"; foreach (var url i sList) { Prøv { tæl++; var arrs = URL. Split('/'); WebRequest-anmodning = WebRequest.Create(url); HttpWebResponse res = (HttpWebResponse)-anmodning. GetResponse(); WebResponse svar = anmodning. GetResponse(); hvis (res. StatusCode.ToString() == "OK") { Stream responseStream = response. GetResponseStream(); using (FileStream fsWrite = ny FileStream($"F:/Audio/v4/{arrs[arrs. Længde - 2]}/{arrs[arrs. Længde - 1]}", FileMode.OpenOrCreate, FileAccess.Write)) { byte[] buffer = ny byte[response. IndholdLængde]; mens (sand) { Returnerer antallet af bytes, der faktisk blev læst denne gang int r = responseStream.Read(buffer, 0, buffer. Længde); hvis (r == 0) { pause; } fsWrite.Write(buffer, 0, r); Skriv
} } } hvis (count % 20 == 0 || count == sList.Count) //{ Console.WriteLine($"Thread{optObj.ThreadIndex} processed:{count}"); //}
} catch (Undtagelse f.eks.) { string strErrorLogFile = System.AppDomain.CurrentDomain.BaseDirectory + $"\\{optObj.ThreadIndex}ErrorLog.log"; hvis (! System.IO.File.Exists(strErrorLogFile)) System.IO.File.WriteAllText(strErrorLogFile, "//System ErrorLog File\r\n"); object objSql = "thread" + optObj.ThreadIndex.ToString() + ex. Besked; 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} slutter"); (optObj.WaitHandle som AutoResetEvent). Set(); Sætmetoden er at markere, når en tråd slutter } }
public class Objpt { public List<String> sList { get; sat; } public WaitHandle WaitHandle { get; sat; } public int ThreadIndex { get; sat; }
}
|