Tento článek je zrcadlovým článkem o strojovém překladu, klikněte zde pro přechod na původní článek.

Pohled: 16438|Odpověď: 0

[WinForm] Vícevláknový vývoj v C#

[Kopírovat odkaz]
Zveřejněno 11.12.2019 12:08:45 | | |
Cílem je stáhnout téměř 40 000 audio kusů z Alibaba Cloud do místní oblasti, přičemž jedno stažení je velmi pomalé, takže chci použít multithreading a přidělit 20 vláken ke stažení najednou, čímž ušetřím spoustu času
          Program tříd
    {

        static void Main(string[] args) {
            string sql = "select en_audio,us_audio from t_audio LIMIT 198";
            MySqlDataReader mySqlDataReader = DBHelper.ExecuteReader(sql);         
            List<String> sList = nový 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)
            {
                while (mySqlDataReader.Read())
                {                 
                    sList.Add(mySqlDataReader.GetString(0));
                    sList.Add(mySqlDataReader.GetString(1));
                }
            }              
            Console.WriteLine(sList.Count);
            Stopky = nové Stopky();
            Stopky. Start();
            ThreadStart(sList);
            WaitHandle.WaitAll(waits);  Všechny vlákna v poslechu čekání byla nastavena před vykonáním následujícího kódu, jinak budou čekat zde
            Stopky. Stop();
            Console.WriteLine($"Časově náročné{stopky. uplynoucí milisekundy}milisekundy");
            Console.ReadKey();


        }
       statické vlákna[] = nové vlákno[20];
        statický WaitHandle[] čeká = nový WaitHandle[20];
        public static void ThreadStart(List<String> nums) {
                  Přiřazení vláken
            pro (int i=0; i<20; i++) {
                threads[i] = nové Thread(DownLoadFile);
                waits[i] = nový AutoResetEvent(false);

            }
                 Přiřaďte data ke každému vláknu pro spuštění a zahájení vykonávání
            pro (int i = 0; Je mi < 20; i++)
            {
                if (i== vlákna. Délka-1) {
                    var retult = nums. Přeskoč (nums. Počet / 20 * i). Vezmi si (nums. Hrabě- nums. Count / 20*i). ToList();
                    vlákna[i]. Start(nový Objpt()
                    {
                        sList = retult,
                        WaitHandle = čeká[i],
                        ThreadIndex = i
                    });
                }
                jinak {
                  var retult= nums. Přeskoč (nums. Počet / 20 * i). Vezmi si (nums. Count / 20). ToList();
                    vlákna[i]. Start(new Objpt() {
                     sList= retult,
                     WaitHandle=waits[i],
                     ThreadIndex=i
                    });
                }

            }
        }

        public static void DownLoadFile(Object obj)
        {
            počet in-stop = 0;
            Objpt optObj = (obj jako Objpt);
            var sList = optObj.sList;
            Console.WriteLine($"Thread{optObj.ThreadIndex} started";
            foreach (var url ve sList)
            {
                zkus
                {
                    počet++;
                    var arrs = URL. Split('/');
                    WebRequest request = WebRequest.Create(url);
                    HttpWebResponse res = (HttpWebResponse)požadavek. GetResponse();
                    WebResponse response = požadavek. GetResponse();           
                    pokud (res. StatusCode.ToString() == "OK")
                    {
                        Stream responseStream = response. GetResponseStream();
                        používající (FileStream fsWrite = nový FileStream($"F:/Audio/v4/{arrs[arrs. Délka - 2]}/{arrs[arrs. Délka - 1]}", FileMode.OpenOrCreate, FileAccess.Write))
                        {
                            byte[] buffer = nový bajt[response. ContentLength];
                            zatímco (pravda)
                            {
                                Vrátí počet bajtů skutečně přečtených tentokrát
                                int r = responseStream.Read(buffer, 0, buffer. délka);
                                pokud (r == 0)
                                {
                                    pauza;
                                }
                                fsWrite.Write(buffer, 0, r); Napsat

                            }
                        }
                    }
                    if (count % 20 == 0 || count == sList.Count)
                    //{
                    Console.WriteLine($"Thread{optObj.ThreadIndex} processed:{count}");
                    //}

                }
                chytit (Výjimka ex)
                {
                    string strErrorLogFile = System.AppDomain.CurrentDomain.BaseDirectory + $"\\{optObj.ThreadIndex}ErrorLog.log";
                    pokud (! System.IO.File.Exists(strErrorLogFile))
                        System.IO.File.WriteAllText(strErrorLogFile, "//System ErrorLog File\r\n");
                    object objSql = "thread" + optObj.ThreadIndex.ToString() + ex. Zpráva;
                    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 jako AutoResetEvent). set();  metoda set je označit, kdy vlákno končí
        }
    }

     public class Objpt {
        public List<String> sList { get; set; }
        public WaitHandle WaitHandle { get; set; }
        public int ThreadIndex { get; set; }

    }





Předchozí:net/c# Jak implementovat DNS hijacking
Další:Použití DateTime
Zřeknutí se:
Veškerý software, programovací materiály nebo články publikované organizací Code Farmer Network slouží pouze k učení a výzkumu; Výše uvedený obsah nesmí být používán pro komerční ani nelegální účely, jinak nesou všechny důsledky uživatelé. Informace na tomto webu pocházejí z internetu a spory o autorská práva s tímto webem nesouvisí. Musíte výše uvedený obsah ze svého počítače zcela smazat do 24 hodin od stažení. Pokud se vám program líbí, podporujte prosím originální software, kupte si registraci a získejte lepší skutečné služby. Pokud dojde k jakémukoli porušení, kontaktujte nás prosím e-mailem.

Mail To:help@itsvse.com