El negocio que hay que hacer es descargar casi 40.000 piezas de audio desde Alibaba Cloud a la zona, y una sola descarga es muy lenta, así que quiero usar multihilo y asignar 20 hilos para descargar al mismo tiempo, ahorrando mucho tiempo Programa de la clase {
vacío estático Main(string[] args) { string sql = "seleccionar en_audio,us_audio de t_audio LÍMITE 198"; MySqlDataReader mySqlDataReader = DBHelper.ExecuteReader(sql); Lista<String> sLista = nueva Lista<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) { mientras que (mySqlDataReader.Read()) { sList.Add(mySqlDataReader.GetString(0)); sList.Add(mySqlDataReader.GetString(1)); } } Consola.WriteLine(sList.Count); Cronómetro = cronómetro nuevo(); Cronómetro. Inicio(); ThreadStart(sList); EsperaManejar.EsperaTodo(espera); Todos los hilos en la espera de escucha se han configurado antes de ejecutar el siguiente código, de lo contrario estarán esperando aquí Cronómetro. Stop(); Console.WriteLine($"Consume tiempo{cronómetro. Milisegundos Pasados}milisegundos"); Consola.ReadKey();
} Hilos estáticos[] = nuevo Hilo[20]; WaitHandle[] esperas estático = nuevo WaitHandle[20]; public static void ThreadStart(List<String> nums) { Asignar hilos para (int i=0; i<20; i++) { threads[i] = nuevo Thread(DownLoadFile); espera[i] = nuevo AutoResetEvent(false);
} Asigna datos a cada hilo para ejecutar y comenzar la ejecución para (int i = 0; < 20; i++) { if (i== hilos. Longitud-1) { var retult = nums. Salta (nums. Cuenta / 20 * i). Toma(s). Contad- nums. Cuenta / 20*i). ToList(); hilos[i]. Inicio(nuevo Objpt() { sList = retult, WaitHandle = esperas[i], ThreadIndex = i }); } else { var retult= nums. Salta (nums. Cuenta / 20 * i). Toma(s). Cuenta / 20). ToList(); hilos[i]. Start(new Objpt() { sList= retult, EsperaHandle=espera[i], ThreadIndex=i }); }
} }
empty estático público DownLoadFile(Object obj) { conteo de inteligencia = 0; Objpt optObj = (obj como Objpt); var sList = optObj.sList; Console.WriteLine($"Thread{optObj.ThreadIndex} started"; foreach (var url en sList) { Prueba { count++; var arrs = url. Split('/'); Solicitud WebRequest = WebRequest.Create(url); HttpWebResponse res = (HttpWebResponse)request. GetResponse(); Respuesta WebResponse = solicitud. GetResponse(); si (res. StatusCode.ToString() == "OK") { Respuesta de corrienteFlujo = respuesta. GetResponseStream(); usando (FileStream fsWrite = new FileStream($"F:/Audio/v4/{arrs[arrs. Longitud - 2]}/{arrs[arrs. Longitud - 1]}", FileMode.OpenOrCreate, FileAccess.Write)) { byte[] buffer = nuevo byte[respuesta. LongitudContenido]; mientras que (verdadero) { Devuelve el número de bytes realmente leídos esta vez int r = responseStream.Read(buffer, 0, buffer. Longitud); if (r == 0) { pausa; } fsWrite.Write(buffer, 0, r); escribe
} } } si (count % 20 == 0 || count == sList.Count) //{ Console.WriteLine($"Thread{optObj.ThreadIndex} procesado:{count}"); //}
} catch (excepción ex) { string strErrorLogFile = System.AppDomain.CurrentDomain.BaseDirectory + $"\\{optObj.ThreadIndex}ErrorLog.log"; si (! System.IO.File.Exists(strErrorLogFile)) System.IO.File.WriteAllText(strErrorLogFile, "//System ErrorLog File\r\n"); object objSql = "thread" + optObj.ThreadIndex.ToString() + ex. Mensaje; System.IO.File.AppendAllText(strErrorLogFile, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\t" + objSql.ToString() + url + "\r\n");
}
} Console.WriteLine($"Thread{optObj.Index} ends"); (optObj.WaitHandle como AutoResetEvent). Set(); El método set es marcar cuándo termina un hilo } }
clase pública Objpt { public<String> List sList { get; set; } public WaitHandle WaitHandle { get; set; } public int ThreadIndex { get; set; }
}
|