A feladat, hogy közel 40 000 hangdarabot töltsek le az Alibaba Cloudból a helyi területre, és egyetlen letöltés nagyon lassú, ezért szeretnék többszálas rendszert használni, és 20 szálat kijelölni egyszerre letölteni, így sok időt spórolok Osztályprogram {
statikus void Main(string[] args) { string sql = "en_audio,us_audio kiválassz t_audio LIMIT 198-ból"; MySqlDataReader mySqlDataReader = DBHelper.ExecuteReader(sql); List<String> sList = új 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) { miközben (mySqlDataReader.Read()) { sList.Add(mySqlDataReader.GetString(0)); sList.Add(mySqlDataReader.GetString(1)); } } Console.WriteLine(sList.Count); Stopper stopper = új Stopper(); stopperórá. Start(); ThreadStart(sList); WaitHandle.WaitAll(vár) Minden szál a hallgatás várakozásában be van állítva, mielőtt a következő kódot végrehajtanák, különben itt várnak stopperórá. Stop(); Console.WriteLine($"Time-consuming{stopwatch. ElastdMilliseconds}milliseconds"); Console.ReadKey();
} statikus Thread[] threads = új Thread[20]; static WaitHandle[] waits = új WaitHandle[20]; public static void ThreadStart(List<String> nums) { Szálak rendelése for (int i=0; i<20; i++) { threads[i] = új Thread(DownLoadFile); várakozik[i] = új AutoResetEvent (hamis);
} Rendelj adatokat minden szálhoz a végrehajtáshoz és a végrehajtás megkezdéséhez for (int i = 0; 20 <; i++) { ha (i== szálak. Hosszúság-1) { var retult = nums. Skip(nums. Számolás / 20 * i). Vegyél (nums. Számszám. Count / 20*i). ToList(); szálak[i]. Start(new Objpt() { sList = retult, WaitHandle = várak[i], ThreadIndex = i }); } else { var retult= nums. Skip(nums. Számolás / 20 * i). Vegyél (nums. Számolás / 20). ToList(); szálak[i]. Start(new Objpt() { sList= retult, WaitHandle=várak[i], ThreadIndex=i }); }
} }
public static void DownLoadFile(Object obj) { int szám = 0; Objpt optObj = (obj mint Objpt); var sList = optObj.sList; Console.WriteLine($"Thread{optObj.ThreadIndex} started"; foreach (var url in sList) { próbáld ki { count++; Var arrs = URL. Split('/'); WebRequest request = WebRequest.Create(url); HttpWebResponse res = (HttpWebResponse)request. GetResponse(); WebResponse válasz = kérés. GetResponse(); if (res. StatusCode.ToString() == "OK") { Stream responseStream = válasz. GetResponseStream(); használva (FileStream fsWrite = new FileStream($"F:/Audio/v4/{arrs[arrs. Hossz - 2]}/{arrs[arrs. Hossz - 1]}", FileMode.OpenOrCreate, FileAccess.Write)) { byte[] buffer = új bájt[válasz. ContentLength]; miközben (igaz) { Visszaadja a ténylegesen olvasott bájtok számát ezúttal int r = responseStream.Read(buffer, 0, buffer. Hossz); ha (r == 0) { szünet; } fsWrite.Write(buffer, 0, r); írni
} } } if (count % 20 == 0 || count == sList.Count) //{ Console.WriteLine($"Thread{optObj.ThreadIndex} processed:{count}"); //}
} catch (kivétel ex) { string strErrorLogFile = System.AppDomain.CurrentDomain.BaseDirectory + $"\\{optObj.ThreadIndex}ErrorLog.log"; ha (! System.IO.File.Exists(strErrorLogFile)) System.IO.File.WriteAllText(strErrorLogFile, "//System ErrorLog File\r\n"); object objSql = "thread" + optObj.ThreadIndex.ToString() + ex. Üzenet; 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} ends"); (optObj.WaitHandle as AutoResetEvent). Set(); A sett módszer a megjelölni, amikor egy szál véget ér } }
public class Objpt { public List<String> sList { get; Szett; } public WaitHandle WaitHandle { get; Szett; } public int ThreadIndex { get; Szett; }
}
|