Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 16438|Odpowiedź: 0

[WinForm] Rozwój wielowątkowy w C#

[Skopiuj link]
Opublikowano 11.12.2019 12:08:45 | | |
Zadaniem jest pobranie prawie 40 000 plików audio z Alibaba Cloud do lokalnej społeczności, a jedno pobranie jest bardzo wolne, więc chcę użyć wielowątkowego i przydzielić 20 wątków do pobrania jednocześnie, oszczędzając dużo czasu
          Program klasowy
    {

        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 = nowa 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);
            Stoper = nowy Stoper();
            Stoper. Start();
            ThreadStart(sList);
            WaitHandle.WaitAll(czeka);  Wszystkie wątki w trybie oczekiwania na słuchanie zostały ustawione przed wykonaniem następującego kodu, w przeciwnym razie będą czekać tutaj
            Stoper. Stop();
            Console.WriteLine($"Czasochłonny{stoper. ElapsedMilisekundy}milisekundy");
            Console.ReadKey();


        }
       statyczny wątek[] = nowy wątek[20];
        statyczny WaitHandle[] czeka = nowy WaitHandle[20];
        public static void ThreadStart(List<String> nums) {
                  Przypisz wątki
            dla (int i=0; i<20; i++) {
                threads[i] = nowy Thread(DownLoadFile);
                czeka[i] = nowy AutoResetEvent(false);

            }
                 Przypisz dane do każdego wątku do wykonania i rozpoczęcia wykonania
            dla (int i = 0; Mam < 20 lat; i++)
            {
                if (i== wątków. Długość-1) {
                    var retult = nums. Skip(nums. Licz / 20 * i). Weź (nums. Liczy- nums. Liczenie / 20*i). ToList();
                    wątki[i]. Start(nowy Objpt()
                    {
                        sList = retult,
                        WaitHandle = czeka[i],
                        ThreadIndex = i
                    });
                }
                else {
                  var retult= nums. Skip(nums. Licz / 20 * i). Weź (nums. Count / 20). ToList();
                    wątki[i]. Start(new Objpt() {
                     sList= retult,
                     WaitHandle=czeka[i],
                     ThreadIndex=i
                    });
                }

            }
        }

        public static void DownLoadFile(Object obj)
        {
            liczba int = 0;
            Objpt optObj = (obj jako Objpt);
            var sList = optObj.sList;
            Console.WriteLine($"Thread{optObj.ThreadIndex} started";
            foreach (var url w sList)
            {
                spróbuj
                {
                    liczenie++;
                    var arrs = URL. Split('/');
                    WebRequest request = WebRequest.Create(url);
                    HttpWebResponse res = (HttpWebResponse) żądanie. GetResponse();
                    WebResponse response = żądanie. GetResponse();           
                    if (res. StatusCode.ToString() == "OK")
                    {
                        Stream responseStream = response. GetResponseStream();
                        używając (FileStream fsWrite = nowy FileStream($"F:/Audio/v4/{arrs[arrs. Długość - 2]}/{arrs[arrs. Długość - 1]}", FileMode.OpenOrCreate, FileAccess.Write))
                        {
                            bajt[] bufor = nowy bajt[odpowiedź. ContentLength];
                            podczas gdy (prawdziwe)
                            {
                                Zwraca liczbę bajtów faktycznie odczytanych tym razem
                                int r = responseStream.Read(buffer, 0, buffer. Długość);
                                jeśli (r == 0)
                                {
                                    przerwę;
                                }
                                fsWrite.Write(buffer, 0, r); Napisz

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

                }
                złapanie (Wyjątek ex)
                {
                    string strErrorLogFile = System.AppDomain.CurrentDomain.BaseDirectory + $"\\{optObj.ThreadIndex}ErrorLog.log";
                    jeśli (! System.IO.File.Exists(strErrorLogFile))
                        System.IO.File.WriteAllText(strErrorLogFile, "//System ErrorLog File\r\n");
                    object objSql = "thread" + optObj.ThreadIndex.ToString() + ex. Komunikat;
                    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 jako AutoResetEvent). set();  metoda setowa polega na zaznaczeniu, kiedy wątek się kończy
        }
    }

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

    }





Poprzedni:net/c# Jak zaimplementować przejęcia DNS
Następny:Użycie DateTime
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com