Šis raksts ir mašīntulkošanas spoguļraksts, lūdzu, noklikšķiniet šeit, lai pārietu uz oriģinālo rakstu.

Skats: 16438|Atbildi: 0

[WinForm] C# daudzpavedienu izstrāde

[Kopēt saiti]
Publicēts 11.12.2019 12:08:45 | | |
Veicamais bizness ir lejupielādēt gandrīz 40 000 audio gabalu no Alibaba Cloud uz vietējo apgabalu, un viena lejupielāde ir ļoti lēna, tāpēc es vēlos izmantot vairāku pavedienu un vienlaikus piešķirt 20 pavedienus, lai lejupielādētu, ietaupot daudz laika
          nodarbību programma
    {

        statisks tukšums Main(virkne[] argumenti) {
            virkne sql = "atlasiet en_audio,us_audio no t_audio LIMIT 198 ";
            MySqlDataReader mySqlDataReader = DBHelper.ExecuteReader(sql);         
            Saraksts<String> sList = jauns Saraksts<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)
            {
                kamēr (mySqlDataReader.Read())
                {                 
                    sList.Add(mySqlDataReader.GetString(0));
                    sList.Add(mySqlDataReader.GetString(1));
                }
            }              
            Console.WriteLine(sList.Count);
            Hronometrs = jauns hronometrs ();
            hronometrs. Sākums();
            ThreadStart(sList);
            WaitHandle.WaitAll(gaida);  Visi klausīšanās gaidīšanas pavedieni ir iestatīti pirms šāda koda izpildes, pretējā gadījumā tie gaidīs šeit
            hronometrs. Stop();
            Console.WriteLine($"Laikietilpīgs{hronometrs. ElapsedMilliseconds}milisekundes");
            Console.ReadKey();


        }
       statiskais pavediens[] pavedieni = jauns pavediens[20];
        statiskais WaitHandle[] gaida = jauns WaitHandle[20];
        publiskā statiskā void ThreadStart(Saraksta<String> numuri) {
                  Pavedienu piešķiršana
            for (int i=0; i<20; i++) {
                threads[i] = new Thread(DownLoadFile);
                waits[i] = jauns AutoResetEvent(false);

            }
                 Piešķiriet datus katram pavedienam, lai to izpildītu un sāktu izpildi
            for (int i = 0; I < 20; i++)
            {
                if (i== pavedieni. Garums-1) {
                    var retult = nums. Skip(nums. Skaits / 20 * i). Take(nums. Grāfs. Skaits / 20*i). ToList();
                    pavedieni[i]. Sākums(jauns mērķis()
                    {
                        sList = retult,
                        WaitHandle = gaida[i],
                        ThreadIndex = i
                    });
                }
                citādi {
                  var retult= nums. Skip(nums. Skaits / 20 * i). Take(nums. Skaits / 20). ToList();
                    pavedieni[i]. Start(jauns Objpt() {
                     sList= retult,
                     WaitHandle=gaida[i],
                     ThreadIndex=i
                    });
                }

            }
        }

        public static void DownLoadFile(Object obj)
        {
            int skaits = 0;
            Objpt optObj = (obj kā Objpt);
            var sList = optObj.sList;
            Console.WriteLine($"Thread{optObj.ThreadIndex} sākts";
            foreach (var url sList)
            {
                izmēģināt
                {
                    skaits++;
                    var arrs = url. Split('/');
                    WebRequest pieprasījums = WebRequest.Create(url);
                    HttpWebResponse res = (HttpWebResponse)pieprasījums. Saņemt atbildi ();
                    WebResponse atbilde = pieprasījums. Saņemt atbildi ();           
                    ja (res. StatusCode.ToString() == "Labi")
                    {
                        Stream responseStream = atbilde. GetResponseStream();
                        izmantojot (FileStream fsWrite = new FileStream($"F:/Audio/v4/{arrs[arrs. Garums - 2]}/{arrs[arrs. Garums - 1]}", FileMode.OpenOrCreate, FileAccess.Write))
                        {
                            baits[] buferis = jauns baits[atbilde. ContentLength];
                            kamēr (patiess)
                            {
                                Atgriež šoreiz faktiski nolasīto baitu skaitu
                                int r = responseStream.Read(buferis, 0, buferis. Garums);
                                ja (r == 0)
                                {
                                    pārtraukums;
                                }
                                fsWrite.Write(buferis, 0, r); rakstīt

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

                }
                nozveja (izņēmums, piemēram)
                {
                    virkne strErrorLogFile = System.AppDomain.CurrentDomain.BaseDirectory + $"\\{optObj.ThreadIndex}ErrorLog.log";
                    ja (! System.IO.File.Exists(strErrorLogFile))
                        System.IO.File.WriteAllText(strErrorLogFile, "//System ErrorLog File\r\n");
                    objekts objSql = "pavediens" + optObj.ThreadIndex.ToString() + ex. Ziņojums;
                    System.IO.File.AppendAllText(strErrorLogFile, DateTime.Now.ToString("gggg-MM-dd HH:mm:ss") + "\t" + objSql.ToString() + url + "\r\n");

                }

            }
            Console.WriteLine($"Thread{optObj.ThreadIndex} beidzas");
            (optObj.WaitHandle kā AutoResetEvent). Komplekts();  SET metode ir atzīmēt, kad pavediens beidzas
        }
    }

     publiskā klase Objpt {
        publiskais saraksts<String> sList { get; komplekts; }
        publiskais WaitHandle WaitHandle { get; komplekts; }
        public int ThreadIndex { get; komplekts; }

    }





Iepriekšējo:net/c# Kā īstenot DNS nolaupīšanu
Nākamo:DateTime izmantošana
Atruna:
Visa programmatūra, programmēšanas materiāli vai raksti, ko publicē Code Farmer Network, ir paredzēti tikai mācību un pētniecības mērķiem; Iepriekš minēto saturu nedrīkst izmantot komerciāliem vai nelikumīgiem mērķiem, pretējā gadījumā lietotājiem ir jāuzņemas visas sekas. Informācija šajā vietnē nāk no interneta, un autortiesību strīdiem nav nekāda sakara ar šo vietni. Iepriekš minētais saturs ir pilnībā jāizdzēš no datora 24 stundu laikā pēc lejupielādes. Ja jums patīk programma, lūdzu, atbalstiet oriģinālu programmatūru, iegādājieties reģistrāciju un iegūstiet labākus oriģinālus pakalpojumus. Ja ir kādi pārkāpumi, lūdzu, sazinieties ar mums pa e-pastu.

Mail To:help@itsvse.com