Ta članek je zrcalni članek strojnega prevajanja, kliknite tukaj za skok na izvirni članek.

Pogled: 16438|Odgovoriti: 0

[WinForm] Večnitni razvoj v C#

[Kopiraj povezavo]
Objavljeno na 11. 12. 2019 12:08:45 | | |
Posel, ki ga je treba opraviti, je prenesti skoraj 40.000 zvočnih posnetkov iz Alibaba Cloud na lokalno območje, pri čemer je en prenos zelo počasen, zato želim uporabiti večnitnost in hkrati dodeliti 20 niti za prenos, s čimer prihranim veliko časa
          Razredni program
    {

        static void Main(string[] args) {
            string sql = "izberi en_audio,us_audio iz t_audio LIMIT 198 ";
            MySqlDataReader mySqlDataReader = DBHelper.ExecuteReader(sql);         
            List<String> sList = novi 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)
            {
                medtem ko (mySqlDataReader.Read())
                {                 
                    sList.Add(mySqlDataReader.GetString(0));
                    sList.Add(mySqlDataReader.GetString(1));
                }
            }              
            Console.WriteLine(sList.Count);
            Štoparica = nova štoparica();
            štoparica. Start();
            ThreadStart(sList);
            WaitHandle.WaitAll(čaka);  Vse niti v čakalnem poslušanju so bile nastavljene pred izvajanjem naslednje kode, sicer bodo čakale tukaj
            štoparica. Stop();
            Console.WriteLine($"Časovno zahtevno{štoparica. ElapsedMilliseconds}milisekunde");
            Console.ReadKey();


        }
       statična nit[] nit = nova nit[20];
        statični WaitHandle[] čaka = nov WaitHandle[20];
        public static void ThreadStart(List<String> nums) {
                  Assign threads
            za (int i=0; i<20; i++) {
                threads[i] = nova nit(DownLoadFile);
                waits[i] = novi AutoResetEvent(false);

            }
                 Dodelite podatke vsaki niti za izvajanje in začetek izvajanja
            za (int i = 0; Jaz < 20; i++)
            {
                if (i== niti. Length-1) {
                    var retult = nums. Preskoči (nums. Štejte / 20 * i). Vzemi (nums. Šteje- nums. Count / 20*i). ToList();
                    niti[i]. Start(novi Objpt()
                    {
                        sList = ponovitev,
                        WaitHandle = čaka[i],
                        ThreadIndex = i
                    });
                }
                else {
                  var retult= nums. Preskoči (nums. Štejte / 20 * i). Vzemi (nums. Štejte / 20). ToList();
                    niti[i]. Start(new Objpt() {
                     sList= ponovitev,
                     WaitHandle=waits[i],
                     ThreadIndex=i
                    });
                }

            }
        }

        javna statična praznina DownLoadFile(Object obj)
        {
            int število = 0;
            Objpt optObj = (obj kot Objpt);
            var sList = optObj.sList;
            Console.WriteLine($"Thread{optObj.ThreadIndex} started";
            foreach (var url v sList)
            {
                poskusi
                {
                    štetje++;
                    var arrs = url. Split('/');
                    WebRequest request = WebRequest.Create(url);
                    HttpWebResponse res = (HttpWebResponse)request. GetResponse();
                    WebResponse response = zahteva. GetResponse();           
                    če (res. StatusCode.ToString() == "OK")
                    {
                        Stream responseStream = response. GetResponseStream();
                        z uporabo (FileStream fsWrite = novi FileStream($"F:/Audio/v4/{arrs[arrs. Dolžina - 2]}/{arrs[arrs. Dolžina - 1]}", FileMode.OpenOrCreate, FileAccess.Write))
                        {
                            bajt[] medpomnilnik = nov bajt[odziv. ContentLength];
                            medtem ko (res)
                            {
                                Vrne število dejansko prebranih bajtov tokrat
                                int r = responseStream.Read(buffer, 0, buffer. Dolžina);
                                če (r == 0)
                                {
                                    premor;
                                }
                                fsWrite.Write(buffer, 0, r); piši

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

                }
                ulov (Izjema ex)
                {
                    string strErrorLogFile = System.AppDomain.CurrentDomain.BaseDirectory + $"\\{optObj.ThreadIndex}ErrorLog.log";
                    če (! System.IO.File.Exists(strErrorLogFile))
                        System.IO.File.WriteAllText(strErrorLogFile, "//System ErrorLog File\r\n");
                    object objSql = "thread" + optObj.ThreadIndex.ToString() + ex. Sporočilo;
                    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 kot AutoResetEvent). set();  metoda množice je označevanje, kdaj nit konča
        }
    }

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

    }





Prejšnji:net/c# Kako implementirati DNS ugrabitve
Naslednji:Uporaba DateTime
Disclaimer:
Vsa programska oprema, programski materiali ali članki, ki jih izdaja Code Farmer Network, so namenjeni zgolj učnim in raziskovalnim namenom; Zgornja vsebina ne sme biti uporabljena v komercialne ali nezakonite namene, sicer uporabniki nosijo vse posledice. Informacije na tej strani prihajajo z interneta, spori glede avtorskih pravic pa nimajo nobene zveze s to stranjo. Zgornjo vsebino morate popolnoma izbrisati z računalnika v 24 urah po prenosu. Če vam je program všeč, podprite pristno programsko opremo, kupite registracijo in pridobite boljše pristne storitve. Če pride do kakršne koli kršitve, nas prosimo kontaktirajte po elektronski pošti.

Mail To:help@itsvse.com