Este artículo es un artículo espejo de traducción automática, por favor haga clic aquí para saltar al artículo original.

Vista: 16438|Respuesta: 0

[WinForm] Desarrollo multihilo en C#

[Copiar enlace]
Publicado en 11/12/2019 12:08:45 | | |
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; }

    }





Anterior:net/c# Cómo implementar el secuestro de DNS
Próximo:Uso de DateTime
Renuncia:
Todo el software, materiales de programación o artículos publicados por Code Farmer Network son únicamente para fines de aprendizaje e investigación; El contenido anterior no se utilizará con fines comerciales o ilegales; de lo contrario, los usuarios asumirán todas las consecuencias. La información de este sitio proviene de Internet, y las disputas de derechos de autor no tienen nada que ver con este sitio. Debes eliminar completamente el contenido anterior de tu ordenador en un plazo de 24 horas desde la descarga. Si te gusta el programa, por favor apoya el software genuino, compra el registro y obtén mejores servicios genuinos. Si hay alguna infracción, por favor contáctanos por correo electrónico.

Mail To:help@itsvse.com