Tämä artikkeli on konekäännöksen peiliartikkeli, klikkaa tästä siirtyäksesi alkuperäiseen artikkeliin.

Näkymä: 16438|Vastaus: 0

[WinForm] C# monisäikeinen kehitys

[Kopioi linkki]
Julkaistu 11.12.2019 12.08.45 | | |
Tehtävänä on ladata lähes 40 000 äänikappaletta Alibaba Cloudista paikalliselle alueelle, ja yksi lataus on hyvin hidasta, joten haluan käyttää monisäikeistä ja varata 20 säikettä ladattavaksi samanaikaisesti, säästäen paljon aikaa
          luokkaohjelma
    {

        staattinen void Main(string[] args) {
            string sql = "valitse en_audio,us_audio t_audio LIMIT 198:sta";
            MySqlDataReader mySqlDataReader = DBHelper.ExecuteReader(sql);         
            List<String> sList = uusi 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)
            {
                kun (mySqlDataReader.Read())
                {                 
                    sList.Add(mySqlDataReader.GetString(0));
                    sList.Add(mySqlDataReader.GetString(1));
                }
            }              
            Console.WriteLine(sList.Count);
            Sekuntikello sekuntikello = uusi Sekuntikello();
            Sekuntikello. Start();
            ThreadStart(sList);
            WaitHandle.WaitAll(odottaa);  Kaikki kuuntelujonon säikeet on asetettu ennen seuraavan koodin suorittamista, muuten ne odottavat täällä
            Sekuntikello. Stop();
            Console.WriteLine($"Time-condoming{stopwatch. EpassdMilliseconds}milliseconds");
            Console.ReadKey();


        }
       staattinen Thread[] threads = uusi Thread[20];
        staattinen WaitHandle[] waits = uusi WaitHandle[20];
        public static void ThreadStart(List<String> nums) {
                  Säikeiden määrittäminen
            for (int i=0; i<20; i++) {
                threads[i] = uusi Thread(DownLoadFile);
                odottaa[i] = uusi AutoResetEvent(väärin);

            }
                 Määritä tiedot jokaiselle säikeelle suoritettavaksi ja aloitetaan suoritus
            kun (int i = 0; Olen < 20; i++)
            {
                jos (i== säikeet. Pituus-1) {
                    var retult = nums. Skip(nums. Laske / 20 * i). Ota (nums. Lukumäärät. Count / 20*i). ToList();
                    Threads[i]. Start(new Objpt()
                    {
                        sList = retult,
                        WaitHandle = odottaa[i],
                        ThreadIndex = i
                    });
                }
                else {
                  var retult= nums. Skip(nums. Laske / 20 * i). Ota (nums. Count / 20). ToList();
                    Threads[i]. Start(new Objpt() {
                     sList= retult,
                     WaitHandle=odottaa[i],
                     ThreadIndex=i
                    });
                }

            }
        }

        public static void DownLoadFile(Object obj)
        {
            int määrä = 0;
            Objpt optObj = (obj muodossa Objpt);
            var sList = optObj.sList;
            Console.WriteLine($"Thread{optObj.ThreadIndex} started";
            foreach (var url in sList)
            {
                yritä
                {
                    count++;
                    VAR arrs = URL. Split('/');
                    WebRequest-pyyntö = WebRequest.Create(url);
                    HttpWebResponse res = (HttpWebResponse)pyyntö. GetResponse();
                    WebResponse-vastaus = pyyntö. GetResponse();           
                    if (resoluutio. StatusCode.ToString() == "OK")
                    {
                        Stream responseStream = vastaus. GetResponseStream();
                        käyttäen (FileStream fsWrite = new FileStream($"F:/Audio/v4/{arrs[arrs. Pituus - 2]}/{arrs[arrs. Pituus - 1]}", FileMode.OpenOrCreate, FileAccess.Write))
                        {
                            tavu[] puskuri = uusi tavu[vastaus. ContentLength];
                            kun (totta)
                            {
                                Palauttaa tällä kertaa oikeasti luettujen tavujen määrän
                                int r = responseStream.Read(buffer, 0, buffer. Pituus);
                                jos (r == 0)
                                {
                                    tauko;
                                }
                                fsWrite.Write(puskuri, 0, r); kirjoita

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

                }
                catch (poikkeus esim.)
                {
                    string strErrorLogFile = System.AppDomain.CurrentDomain.BaseDirectory + $"\\{optObj.ThreadIndex}ErrorLog.log";
                    jos (! System.IO.File.Exists(strErrorLogFile))
                        System.IO.File.WriteAllText(strErrorLogFile, "//System ErrorLog File\r\n");
                    object objSql = "thread" + optObj.ThreadIndex.ToString() + ex. Viesti;
                    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} päättyy");
            (optObj.WaitHandle as AutoResetEvent). Set();  Set-menetelmä on merkitä, milloin säie päättyy
        }
    }

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

    }





Edellinen:net/c# Kuinka toteuttaa DNS-kaappaus
Seuraava:DateTimen käyttö
Vastuuvapauslauseke:
Kaikki Code Farmer Networkin julkaisemat ohjelmistot, ohjelmamateriaalit tai artikkelit ovat tarkoitettu vain oppimis- ja tutkimustarkoituksiin; Yllä mainittua sisältöä ei saa käyttää kaupallisiin tai laittomiin tarkoituksiin, muuten käyttäjät joutuvat kantamaan kaikki seuraukset. Tämän sivuston tiedot ovat peräisin internetistä, eikä tekijänoikeuskiistat liity tähän sivustoon. Sinun tulee poistaa yllä oleva sisältö kokonaan tietokoneeltasi 24 tunnin kuluessa lataamisesta. Jos pidät ohjelmasta, tue aitoa ohjelmistoa, osta rekisteröityminen ja hanki parempia aitoja palveluita. Jos rikkomuksia ilmenee, ota meihin yhteyttä sähköpostitse.

Mail To:help@itsvse.com