Bisnis yang akan dilakukan adalah mengunduh hampir 40.000 lembar audio dari Alibaba Cloud ke area lokal, dan satu unduhan sangat lambat, jadi saya ingin menggunakan multi-threading, dan mengalokasikan 20 utas untuk diunduh secara bersamaan, menghemat banyak waktu Program kelas {
static void Main(string[] args) { string sql = "pilih en_audio,us_audio dari t_audio LIMIT 198 "; MySqlDataReader mySqlDataReader = DBHelper.ExecuteReader(sql); Daftar<String> sList = Daftar baru <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) { sementara (mySqlDataReader.Read()) { sList.Add(mySqlDataReader.GetString(0)); sList.Add(mySqlDataReader.GetString(1)); } } Console.WriteLine(sList.Count); Stopwatch stopwatch = Stopwatch baru(); stopwatch. Mulai(); ThreadStart(sList); WaitHandle.WaitAll(menunggu); Semua utas dalam tunggu dengarkan telah diatur sebelum mengeksekusi kode berikut, jika tidak, mereka akan menunggu di sini stopwatch. Berhenti(); Console.WriteLine($"Memakan waktu{stopwatch. ElapsedMilliseconds}milidetik"); Konsol.BacaKunci();
} utas Thread[] statis = Thread baru[20]; statis WaitHandle[] menunggu = WaitHandle baru[20]; void statis publik ThreadStart(Nomor daftar<String>) { Menetapkan utas untuk (int i=0; i<20; i++) { threads[i] = Thread(DownLoadFile) baru; waits[i] = AutoResetEvent baru(false);
} Tetapkan data ke setiap utas untuk dijalankan dan mulai eksekusi untuk (int i = 0; saya < 20; i++) { jika (i== utas. Panjang-1) { var retult = nums. Lewati (angka. Hitung / 20 * i). Ambil (numula. Jumlah. Hitung / 20*i). ToList(); benang[i]. Mulai(baru Objpt() { sList = retult, WaitHandle = menunggu[i], Indeks Utas = i }); } else { var retult= nums. Lewati (angka. Hitung / 20 * i). Ambil (numula. Hitung / 20). ToList(); benang[i]. Mulai(baru Objpt() { sList= retult, WaitHandle=menunggu[i], Indeks Utas=i }); }
} }
void statis publik DownLoadFile(Objek: obj) { jumlah int = 0; Objpt optObj = (obj sebagai Objpt); var sList = optObj.sList; Console.WriteLine($"Thread{optObj.ThreadIndex} dimulai"; foreach (url var di sList) { Coba { hitung++; var arrs = url. Pisah('/'); Permintaan WebRequest = WebRequest.Create(url); HttpWebResponse res = (HttpWebResponse)permintaan. GetResponse(); Respons WebResponse = permintaan. GetResponse(); jika (res. StatusCode.ToString() == "OK") { Stream responseStream = respons. GetResponseStream(); menggunakan (FileStream fsWrite = new FileStream($"F:/Audio/v4/{arrs[arrs. Panjang - 2]}/{arrs[arrs. Panjang - 1]}", FileMode.OpenOrCreate, FileAccess.Write)) { byte[] buffer = byte baru[respons. Panjang Konten]; sementara (benar) { Mengembalikan jumlah byte yang benar-benar dibaca kali ini int r = responseStream.Read(buffer, 0, buffer. Panjang); jika (r == 0) { istirahat; } fsWrite.Write(buffer, 0, r); Tulis
} } } if (hitungan % 20 == 0 || hitungan == sList.Count) //{ Console.WriteLine($"Thread{optObj.ThreadIndex} diproses:{count}"); //}
} tangkap (Pengecualian mis) { string strErrorLogFile = System.AppDomain.CurrentDomain.BaseDirectory + $"\\{optObj.ThreadIndex}ErrorLog.log"; jika (! Sistem.IO.File.Ada(strErrorLogFile)) System.IO.File.WriteAllText(strErrorLogFile, "//System ErrorLog File\r\n"); objek objSql = "utas" + optObj.ThreadIndex.ToString() + ex. Pesan; 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 sebagai AutoResetEvent). Set(); set adalah untuk menandai saat utas berakhir } }
kelas publik Objpt { publik Daftar<String> sList { get; menetapkan; } publik WaitHandle WaitHandle { get; menetapkan; } public int ThreadIndex { get; menetapkan; }
}
|