Verslas, kurį reikia atlikti, yra atsisiųsti beveik 40 000 garso įrašų iš "Alibaba Cloud" į vietinę teritoriją, o vienas atsisiuntimas yra labai lėtas, todėl noriu naudoti kelių gijų ir vienu metu atsisiųsti 20 gijų, sutaupydamas daug laiko klasės programa {
static void Main(string[] args) { string sql = "pasirinkite en_audio,us_audio iš t_audio LIMIT 198 "; MySqlDataReader mySqlDataReader = DBHelper.ExecuteReader(sql); Sąrašas<String> sList = naujas Sąrašas<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) { o (mySqlDataReader.Read()) { sList.Add(mySqlDataReader.GetString(0)); sList.Add(mySqlDataReader.GetString(1)); } } Console.WriteLine(sList.Count); Chronometras = naujas chronometras (); chronometras. Pradžia(); ThreadStart(sList); WaitHandle.WaitAll(laukia); Visos klausymosi laukimo gijos buvo nustatytos prieš vykdant šį kodą, kitaip jos lauks čia chronometras. Stop(); Console.WriteLine($"Daug laiko{chronometras. ElapsedMilliseconds}milisekundes"); Console.ReadKey();
} statinė gija[] gijos = nauja gija[20]; statinis WaitHandle[] waits = naujas WaitHandle[20]; public static void ThreadStart(List<String> nums) { Priskirti gijas for (int i=0; I<20; i++) { threads[i] = new Thread(DownLoadFile); waits[i] = naujas AutoResetEvent(false);
} Priskirkite duomenis kiekvienai gijai, kad ji būtų vykdoma ir pradėtų vykdyti for (int i = 0; I < 20; i++) { if (i== gijos. Ilgis-1) { var retult = nums. Skip(nums. Skaičius / 20 * i). Take(nums. Grafas. Skaičius / 20*i). ToList(); gijos[i]. Start(naujas Objpt() { sList = retult, WaitHandle = laukia[i], ThreadIndex = i }); } kitaip { var retult= nums. Skip(nums. Skaičius / 20 * i). Take(nums. Skaičius / 20). ToList(); gijos[i]. Start(naujas Objpt() { sList= retult, WaitHandle=laukia[i], ThreadIndex=i }); }
} }
public static void DownLoadFile(Object obj) { int skaičius = 0; Objpt optObj = (obj kaip Objpt); var sList = optObj.sList; Console.WriteLine($"Thread{optObj.ThreadIndex} pradėta"; foreach (var url sList) { Pabandykite { skaičius++; var arrs = url. Split('/'); WebRequest užklausa = WebRequest.Create(url); HttpWebResponse res = (HttpWebResponse)užklausa. GetResponse(); WebResponse atsakymas = užklausa. GetResponse(); jei (res. StatusCode.ToString() == "Gerai") { Stream responseStream = atsakymas. GetResponseStream(); naudojant (FileStream fsWrite = new FileStream($"F:/Audio/v4/{arrs[arrs. Ilgis - 2]}/{arrs[arrs. Ilgis - 1]}", FileMode.OpenOrCreate, FileAccess.Write)) { baitas[] buferis = naujas baitas[atsakymas. ContentLength]; nors (tiesa) { Grąžina šį kartą faktiškai perskaitytų baitų skaičių int r = responseStream.Read(buferis, 0, buferis. ilgis); jei (r == 0) { pertrauka; } fsWrite.Write(buferis, 0, r); rašyti
} } } if (skaičius % 20 == 0 || skaičius == sList.Count) //{ Console.WriteLine($"Thread{optObj.ThreadIndex} apdorotas:{count}"); //}
} laimikis (išimtis ex) { eilutė strErrorLogFile = System.AppDomain.CurrentDomain.BaseDirectory + $"\\{optObj.ThreadIndex}ErrorLog.log"; jei (! System.IO.File.Exists(strErrorLogFile)) System.IO.File.WriteAllText(strErrorLogFile, "//System ErrorLog File\r\n"); object objSql = "thread" + optObj.ThreadIndex.ToString() + ex. Žinutė; 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} baigiasi"); (optObj.WaitHandle kaip AutoResetEvent). Rinkinys(); nustatyti metodą yra pažymėti, kada baigiasi siūlas } }
viešoji klasė Objpt { viešas sąrašas<String> sList { get; rinkinys; } viešasis WaitHandle WaitHandle { gauti; rinkinys; } public int ThreadIndex { get; rinkinys; }
}
|