Denna artikel är en spegelartikel om maskinöversättning, klicka här för att hoppa till originalartikeln.

Utsikt: 16438|Svar: 0

[WinForm] C# multitrådad utveckling

[Kopiera länk]
Publicerad på 2019-12-11 12:08:45 | | |
Affären som ska göras är att ladda ner nästan 40 000 ljudbitar från Alibaba Cloud till lokalområdet, och en enda nedladdning är mycket långsam, så jag vill använda multitrådning och allokera 20 trådar för att ladda ner samtidigt, vilket sparar mycket tid
          Klassprogram
    {

        statiskt tomrum Main(string[] args) {
            sträng sql = "välj en_audio,us_audio från t_audio LIMIT 198 ";
            MySqlDataReader mySqlDataReader = DBHelper.ExecuteReader(sql);         
            List<String> sList = ny 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)
            {
                medan (mySqlDataReader.Read())
                {                 
                    sList.Add(mySqlDataReader.GetString(0));
                    sList.Add(mySqlDataReader.GetString(1));
                }
            }              
            Console.WriteLine(sList.Count);
            Stoppur = ny stoppur (stoppur);
            Stoppur. Start();
            ThreadStart(sList);
            WaitHandle.WaitAll(waits);  Alla trådar i lyssna-väntan har ställts in innan följande kod exekveras, annars väntar de här
            Stoppur. Stop();
            Console.WriteLine($"Tidskrävande{stopwatch. FörflutnaMillisekunder}millisekunder");
            Console.ReadKey();


        }
       statisk tråd[] trådar = ny tråd[20];
        statisk WaitHandle[] waits = ny WaitHandle[20];
        publik statisk void ThreadStart(List<String> nums) {
                  Tilldela trådar
            för (int i=0; I<20; i++) {
                threads[i] = ny tråd(DownLoadFile);
                waits[i] = ny AutoResetEvent(false);

            }
                 Tilldela data till varje tråd för att köra och starta exekveringen
            för (int i = 0; Jag < 20; i++)
            {
                om (i== trådar. Längd-1) {
                    var retult = nums. Skip(nums. Count / 20 * i). Ta (nums. Räkna-nums. Count / 20*i). ToList();
                    trådar[i]. Start(ny Objpt()
                    {
                        sList = retult,
                        WaitHandle = waits[i],
                        ThreadIndex = i
                    });
                }
                annars {
                  var retult= nums. Skip(nums. Count / 20 * i). Ta (nums. Count / 20). ToList();
                    trådar[i]. Start(new Objpt() {
                     sList= retult,
                     WaitHandle=waits[i],
                     ThreadIndex=i
                    });
                }

            }
        }

        offentlig statisk void DownLoadFile(Objekt obj)
        {
            Int count = 0;
            Objpt optObj = (obj som Objpt);
            var sList = optObj.sList;
            Console.WriteLine($"Thread{optObj.ThreadIndex} startade";
            foreach (var url i sList)
            {
                Försök
                {
                    räkning++;
                    var arrs = URL. Split('/');
                    WebRequest-begäran = WebRequest.Create(url);
                    HttpWebResponse res = (HttpWebResponse)-begäran. GetResponse();
                    WebResponse svar = begäran. GetResponse();           
                    om (res. StatusCode.ToString() == "OK")
                    {
                        Stream responseStream = response. GetResponseStream();
                        using (FileStream fsWrite = new FileStream($"F:/Audio/v4/{arrs[arrs. Längd - 2]}/{arrs[arrs. Length - 1]}", FileMode.OpenOrCreate, FileAccess.Write))
                        {
                            byte[] buffer = ny byte[response. InnehållLängd];
                            medan (sann)
                            {
                                Returnerar antalet byte som faktiskt lästes denna gång
                                int r = responseStream.Read(buffer, 0, buffer. längd);
                                om (r == 0)
                                {
                                    paus;
                                }
                                fsWrite.Write(buffer, 0, r); skriv

                            }
                        }
                    }
                    om (räkna % 20 == 0 || räkna == sList.Räkna)
                    //{
                    Console.WriteLine($"Thread{optObj.ThreadIndex} processed:{count}");
                    //}

                }
                catch (Undantag t.ex.)
                {
                    sträng strErrorLogFile = System.AppDomain.CurrentDomain.BaseDirectory + $"\\{optObj.ThreadIndex}ErrorLog.log";
                    om (! System.IO.File.Exists(strErrorLogFile))
                        System.IO.File.WriteAllText(strErrorLogFile, "//System ErrorLog File\r\n");
                    object objSql = "thread" + optObj.ThreadIndex.ToString() + ex. Meddelande;
                    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} slutar");
            (optObj.WaitHandle som AutoResetEvent). Set();  Set-metoden är att markera när en tråd slutar
        }
    }

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

    }





Föregående:net/c# Hur man implementerar DNS-kapning
Nästa:Användning av DateTime
Friskrivning:
All programvara, programmeringsmaterial eller artiklar som publiceras av Code Farmer Network är endast för lärande- och forskningsändamål; Ovanstående innehåll får inte användas för kommersiella eller olagliga ändamål, annars kommer användarna att bära alla konsekvenser. Informationen på denna sida kommer från internet, och upphovsrättstvister har inget med denna sida att göra. Du måste helt radera ovanstående innehåll från din dator inom 24 timmar efter nedladdning. Om du gillar programmet, vänligen stöd äkta programvara, köp registrering och få bättre äkta tjänster. Om det finns något intrång, vänligen kontakta oss via e-post.

Mail To:help@itsvse.com