Ülesanne on alla laadida ligi 40 000 helilõiku Alibaba pilvest kohalikku piirkonda ning üks allalaadimine on väga aeglane, seega tahan kasutada mitmelõimelist lahendust ja eraldada 20 lõime samaaegselt allalaadimiseks, säästes palju aega Klassiprogramm {
staatiline void Main(string[] args) { string sql = "vali en_audio,us_audio t_audio LIMIT 198-st"; MySqlDataReader mySqlDataReader = DBHelper.ExecuteReader(sql); List<String> sList = uus 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); Stopper stopper = uus stopper(); stopper. Start(); ThreadStart(sList); WaitHandle.WaitAll(ootab); Kõik kuulamisootuses olevad lõimed on seadistatud enne järgmise koodi käivitamist, muidu ootavad nad siin stopper. Stop(); Console.WriteLine($"Time-consuming{stopwatch. MöödunudMillisekundid}millisekundid"); Console.ReadKey();
} staatiline Thread[] threads = uus Thread[20]; staatiline WaitHandle[] waits = uus WaitHandle[20]; public static void ThreadStart(List<String> nums) { Lõimede määramine for (int i=0; i<20; i++) { threads[i] = uus Thread(DownLoadFile); ootab[i] = uus AutoResetEvent(vale);
} Määra igale lõimele andmed täitmiseks ja käivitamiseks for (int i = 0; Ma < 20; i++) { kui (i== lõimed. Pikkus-1) { var retult = nums. Vahele jätta (nums. Loend / 20 * i). Võta (num. Loendus- numbreid. Loend / 20*i). ToList(); teemad[i]. Start(new Objpt() { sList = retult, WaitHandle = ootab[i], ThreadIndex = i }); } else { var retult= nums. Vahele jätta (nums. Loend / 20 * i). Võta (num. Loendus / 20). ToList(); teemad[i]. Start(new Objpt() { sList= retult, WaitHandle=ootab[i], ThreadIndex=i }); }
} }
public static void DownLoadFile(Object obj) { int arv = 0; Objpt optObj = (obj kui Objpt); var sList = optObj.sList; Console.WriteLine($"Thread{optObj.ThreadIndex} started"; foreach (var url sListis) { proovi { loendus++; var arrs = URL. Split('/'); WebRequest request = WebRequest.Create(url); HttpWebResponse res = (HttpWebResponse)request. GetResponse(); WebResponse vastus = päring. GetResponse(); if (res. StatusCode.ToString() == "OK") { Voog vastusStream = vastus. GetResponseStream(); kasutades (FileStream fsWrite = new FileStream($"F:/Audio/v4/{arrs[arrs. Pikkus - 2]}/{arrs[arrs. Pikkus - 1]}", FileMode.OpenOrCreate, FileAccess.Write)) { bait[] puhver = uus bait[vastus. ContentLength]; samal ajal (tõene) { Tagastab seekord loetud baitide arvu int r = responseStream.Read(puhver, 0, puhver. Pikkus); kui (r == 0) { paus; } fsWrite.Write(puhver, 0, r); kirjuta
} } } if (count % 20 == 0 || count == sList.Count) //{ Console.WriteLine($"Thread{optObj.ThreadIndex} processed:{count}"); //}
} catch (Exception ex) { string strErrorLogFile = System.AppDomain.CurrentDomain.BaseDirectory + $"\\{optObj.ThreadIndex}ErrorLog.log"; kui (! System.IO.File.Exists(strErrorLogFile)) System.IO.File.WriteAllText(strErrorLogFile, "//System ErrorLog File\r\n"); object objSql = "thread" + optObj.ThreadIndex.ToString() + ex. Sõnum; 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} lõpeb"); (optObj.WaitHandle as AutoResetEvent). Set(); Set-meetod on märgistada, millal lõim lõpeb } }
public class Objpt { public List<String> sList { get; seatud; } public WaitHandle WaitHandle { get; seatud; } public int ThreadIndex { get; seatud; }
}
|