Tento článok je zrkadlovým článkom o strojovom preklade, kliknite sem pre prechod na pôvodný článok.

Pohľad: 16438|Odpoveď: 0

[WinForm] Viacvláknový vývoj v C#

[Kopírovať odkaz]
Zverejnené 11. 12. 2019 12:08:45 | | |
Úlohou je stiahnuť takmer 40 000 kusov zvuku z Alibaba Cloud do lokálnej oblasti, pričom jedno stiahnutie je veľmi pomalé, preto chcem použiť viacvláknové spracovanie a prideliť 20 vlákien na stiahnutie naraz, čím ušetrím veľa času
          Triedny program
    {

        static void Main(string[] args) {
            string sql = "select en_audio,us_audio z 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(čaká);  Všetky vlákna v čakacej fáze počúvania boli nastavené pred vykonaním nasledujúceho kódu, inak budú čakať tu
            Stopky. Stop();
            Console.WriteLine($"Časovo náročné{stopky. ElapsedMilliseconds}milisekundy");
            Console.ReadKey();


        }
       statické vlákna[] = nové vlákna[20];
        statický WaitHandle[] čaká = nový WaitHandle[20];
        public static void ThreadStart(List<String> nums) {
                  Priraď vlákna
            pre (int i=0; i<20; i++) {
                threads[i] = nový Thread(DownLoadFile);
                waits[i] = nový AutoResetEvent(false);

            }
                 Priraďte dáta ku každému vláknu na vykonanie a spustenie vykonávania
            pre (int i = 0; Mám < 20; i++)
            {
                ak (i== vlákna. Dĺžka-1) {
                    var retult = nums. Preskoč (nums. Počítaj / 20 * i). Vezmi si (nums. Count- nums. Count / 20*i). ToList();
                    threads[i]. Štart(nový Objpt()
                    {
                        sList = retult,
                        WaitHandle = čaká[i],
                        ThreadIndex = i
                    });
                }
                else {
                  var retult= nums. Preskoč (nums. Počítaj / 20 * i). Vezmi si (nums. Count / 20). ToList();
                    threads[i]. Start(new Objpt() {
                     sList= retult,
                     WaitHandle=čaká[i],
                     ThreadIndex=i
                    });
                }

            }
        }

        public static void DownLoadFile(Object obj)
        {
            počet int = 0;
            Objpt optObj = (obj ako Objpt);
            var sList = optObj.sList;
            Console.WriteLine($"Thread{optObj.ThreadIndex} started";
            foreach (var url v sList)
            {
                Skús
                {
                    count++;
                    var arrs = URL. Split('/');
                    WebRequest request = WebRequest.Create(url);
                    HttpWebResponse res = (HttpWebResponse) požiadavka. GetResponse();
                    WebResponse response = žiadosť. GetResponse();           
                    ak (res. StatusCode.ToString() == "OK")
                    {
                        Stream responseStream = response. GetResponseStream();
                        používajúc (FileStream fsWrite = nový FileStream($"F:/Audio/v4/{arrs[arrs. Dĺžka - 2]}/{arrs[arrs. Dĺžka - 1]}", FileMode.OpenOrCreate, FileAccess.Write))
                        {
                            byte[] buffer = nový bajt[odpoveď. ContentLength];
                            zatiaľ čo (pravda)
                            {
                                Vráti počet skutočne prečítaných bajtov tentoraz
                                int r = responseStream.Read(buffer, 0, buffer. Dĺžka);
                                ak (r == 0)
                                {
                                    prestávka;
                                }
                                fsWrite.Write(buffer, 0, r); píš

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

                }
                chytiť (Výnimka ex)
                {
                    string strErrorLogFile = System.AppDomain.CurrentDomain.BaseDirectory + $"\\{optObj.ThreadIndex}ErrorLog.log";
                    ak (! System.IO.File.Exists(strErrorLogFile))
                        System.IO.File.WriteAllText(strErrorLogFile, "//System ErrorLog File\r\n");
                    object objSql = "thread" + optObj.ThreadIndex.ToString() + ex. Sprá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 ako AutoResetEvent). set();  metóda set je označiť, kedy vlákno končí
        }
    }

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

    }





Predchádzajúci:net/c# Ako implementovať únos DNS
Budúci:Použitie DateTime
Vyhlásenie:
Všetok softvér, programovacie materiály alebo články publikované spoločnosťou Code Farmer Network slúžia len na vzdelávacie a výskumné účely; Vyššie uvedený obsah nesmie byť použitý na komerčné alebo nezákonné účely, inak nesú všetky následky používateľmi. Informácie na tejto stránke pochádzajú z internetu a spory o autorské práva s touto stránkou nesúvisia. Musíte úplne vymazať vyššie uvedený obsah zo svojho počítača do 24 hodín od stiahnutia. Ak sa vám program páči, podporte originálny softvér, zakúpte si registráciu a získajte lepšie originálne služby. Ak dôjde k akémukoľvek porušeniu, kontaktujte nás prosím e-mailom.

Mail To:help@itsvse.com