Ez a cikk egy tükör gépi fordítás, kérjük, kattintson ide, hogy ugorjon az eredeti cikkre.

Nézet: 16438|Válasz: 0

[WinForm] C# többszálas fejlesztés

[Linket másol]
Közzétéve 2019. 12. 11. 12:08:45 | | |
A feladat, hogy közel 40 000 hangdarabot töltsek le az Alibaba Cloudból a helyi területre, és egyetlen letöltés nagyon lassú, ezért szeretnék többszálas rendszert használni, és 20 szálat kijelölni egyszerre letölteni, így sok időt spórolok
          Osztályprogram
    {

        statikus void Main(string[] args) {
            string sql = "en_audio,us_audio kiválassz t_audio LIMIT 198-ból";
            MySqlDataReader mySqlDataReader = DBHelper.ExecuteReader(sql);         
            List<String> sList = új 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)
            {
                miközben (mySqlDataReader.Read())
                {                 
                    sList.Add(mySqlDataReader.GetString(0));
                    sList.Add(mySqlDataReader.GetString(1));
                }
            }              
            Console.WriteLine(sList.Count);
            Stopper stopper = új Stopper();
            stopperórá. Start();
            ThreadStart(sList);
            WaitHandle.WaitAll(vár)  Minden szál a hallgatás várakozásában be van állítva, mielőtt a következő kódot végrehajtanák, különben itt várnak
            stopperórá. Stop();
            Console.WriteLine($"Time-consuming{stopwatch. ElastdMilliseconds}milliseconds");
            Console.ReadKey();


        }
       statikus Thread[] threads = új Thread[20];
        static WaitHandle[] waits = új WaitHandle[20];
        public static void ThreadStart(List<String> nums) {
                  Szálak rendelése
            for (int i=0; i<20; i++) {
                threads[i] = új Thread(DownLoadFile);
                várakozik[i] = új AutoResetEvent (hamis);

            }
                 Rendelj adatokat minden szálhoz a végrehajtáshoz és a végrehajtás megkezdéséhez
            for (int i = 0; 20 <; i++)
            {
                ha (i== szálak. Hosszúság-1) {
                    var retult = nums. Skip(nums. Számolás / 20 * i). Vegyél (nums. Számszám. Count / 20*i). ToList();
                    szálak[i]. Start(new Objpt()
                    {
                        sList = retult,
                        WaitHandle = várak[i],
                        ThreadIndex = i
                    });
                }
                else {
                  var retult= nums. Skip(nums. Számolás / 20 * i). Vegyél (nums. Számolás / 20). ToList();
                    szálak[i]. Start(new Objpt() {
                     sList= retult,
                     WaitHandle=várak[i],
                     ThreadIndex=i
                    });
                }

            }
        }

        public static void DownLoadFile(Object obj)
        {
            int szám = 0;
            Objpt optObj = (obj mint Objpt);
            var sList = optObj.sList;
            Console.WriteLine($"Thread{optObj.ThreadIndex} started";
            foreach (var url in sList)
            {
                próbáld ki
                {
                    count++;
                    Var arrs = URL. Split('/');
                    WebRequest request = WebRequest.Create(url);
                    HttpWebResponse res = (HttpWebResponse)request. GetResponse();
                    WebResponse válasz = kérés. GetResponse();           
                    if (res. StatusCode.ToString() == "OK")
                    {
                        Stream responseStream = válasz. GetResponseStream();
                        használva (FileStream fsWrite = new FileStream($"F:/Audio/v4/{arrs[arrs. Hossz - 2]}/{arrs[arrs. Hossz - 1]}", FileMode.OpenOrCreate, FileAccess.Write))
                        {
                            byte[] buffer = új bájt[válasz. ContentLength];
                            miközben (igaz)
                            {
                                Visszaadja a ténylegesen olvasott bájtok számát ezúttal
                                int r = responseStream.Read(buffer, 0, buffer. Hossz);
                                ha (r == 0)
                                {
                                    szünet;
                                }
                                fsWrite.Write(buffer, 0, r); írni

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

                }
                catch (kivétel ex)
                {
                    string strErrorLogFile = System.AppDomain.CurrentDomain.BaseDirectory + $"\\{optObj.ThreadIndex}ErrorLog.log";
                    ha (! System.IO.File.Exists(strErrorLogFile))
                        System.IO.File.WriteAllText(strErrorLogFile, "//System ErrorLog File\r\n");
                    object objSql = "thread" + optObj.ThreadIndex.ToString() + ex. Üzenet;
                    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 as AutoResetEvent). Set();  A sett módszer a megjelölni, amikor egy szál véget ér
        }
    }

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

    }





Előző:net/c# Hogyan valósítsuk meg a DNS eltérítést
Következő:A DateTime használata
Lemondás:
A Code Farmer Network által közzétett összes szoftver, programozási anyag vagy cikk kizárólag tanulási és kutatási célokra szolgál; A fenti tartalmat nem szabad kereskedelmi vagy illegális célokra használni, különben a felhasználók viselik az összes következményet. Az oldalon található információk az internetről származnak, és a szerzői jogi vitáknak semmi köze ehhez az oldalhoz. A fenti tartalmat a letöltés után 24 órán belül teljesen törölni kell a számítógépéről. Ha tetszik a program, kérjük, támogassa a valódi szoftvert, vásároljon regisztrációt, és szerezzen jobb hiteles szolgáltatásokat. Ha bármilyen jogsértés történik, kérjük, vegye fel velünk a kapcsolatot e-mailben.

Mail To:help@itsvse.com