Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 16438|Yanıt: 0

[WinForm] C# çok iş parçacıklı geliştirme

[Bağlantıyı kopyala]
Yayınlandı 11.12.2019 12:08:45 | | |
Yapılacak iş, Alibaba Cloud'dan yerel bölgeye yaklaşık 40.000 ses indirmek, tek bir indirme ise çok yavaş, bu yüzden çoklu iş zinciri kullanmak ve aynı anda 20 iş parçacığını indirmek istiyorum, böylece çok zaman kazandırıyorum
          Sınıf Programı
    {

        statik boşluk Main(string[] args) {
            string sql = "t_audio LIMIT 198'den en_audio,us_audio seç";
            MySqlDataReader mySqlDataReader = DBHelper.ExecuteReader(sql);         
            List<String> sList = yeni 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);
            Kronometre kronometresi = yeni Kronometre();
            kronometre. Start();
            ThreadStart(sList);
            WaitHandle.WaitAll(bekliyor);  Dinleme bekleme içindeki tüm iş parçacıkları aşağıdaki kodu çalıştırmadan önce ayarlanmıştır, aksi takdirde burada beklerler
            kronometre. Dur();
            Console.WriteLine($"Time-consuming{stopwatch. GeçmişMilisaniye}milisaniye");
            Console.ReadKey();


        }
       statik Thread[] threads = yeni Thread[20];
        statik WaitHandle[] waits = yeni WaitHandle[20];
        public static void ThreadStart(List<String> nums) {
                  İş parçacıkları atama
            için (int i=0; i<20; i++) {
                threads[i] = yeni Thread(DownLoadFile);
                waits[i] = yeni AutoResetEvent(yanlış);

            }
                 Her iş parçacığına veri atanarak çalıştırın ve çalıştırmaya başlayın
            için (int i = 0; 20 <; i++)
            {
                eğer (i== threads. Uzunluk-1) {
                    var retult = nums. Skip(nums. Sayı / 20 * i). Al (nums. Sayı-sayılar. Sayı / 20*i). ToList();
                    iplikler[i]. Start(new Objpt()
                    {
                        sList = retult,
                        WaitHandle = waits[i],
                        ThreadIndex = i
                    });
                }
                else {
                  var retult= nums. Skip(nums. Sayı / 20 * i). Al (nums. Sayı / 20). ToList();
                    iplikler[i]. Start(new Objpt() {
                     sList= retult,
                     WaitHandle=waits[i],
                     ThreadIndex=i
                    });
                }

            }
        }

        public static void DownLoadFile(Object obj)
        {
            int sayısı = 0;
            Objpt optObj = (obj olarak Objpt);
            var sList = optObj.sList;
            Console.WriteLine($"Thread{optObj.ThreadIndex} started";
            foreach (var url in sList)
            {
                Denemek
                {
                    say++;
                    var arrs = URL. Split('/');
                    WebRequest request = WebRequest.Create(url);
                    HttpWebResponse res = (HttpWebResponse)request. GetResponse();
                    WebResponse yanıtı = istek. GetResponse();           
                    if (çözünürlük. StatusCode.ToString() == "OK")
                    {
                        Akış yanıtıStream = yanıt. GetResponseStream();
                        (FileStream fsWrite = yeni FileStream($"F:/Audio/v4/{arrs[arrs. Uzunluk - 2]}/{arrs[arrs. Uzunluk - 1]}", FileMode.OpenOrCreate, FileAccess.Write))
                        {
                            byte[] buffer = yeni bayt[yanıt. ContentLength];
                            Doğrudur
                            {
                                Bu sefer gerçekten okunan bayt sayısını döndürür
                                int r = responseStream.Read(buffer, 0, buffer. Uzunluk);
                                eğer (r == 0)
                                {
                                    mola;
                                }
                                fsWrite.Write(buffer, 0, r); yaz

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

                }
                catch (İstisna örneğin)
                {
                    string strErrorLogFile = System.AppDomain.CurrentDomain.BaseDirectory + $"\\{optObj.ThreadIndex}ErrorLog.log";
                    if (! System.IO.File.Exists(strErrorLogFile))
                        System.IO.File.WriteAllText(strErrorLogFile, "//System ErrorLog File\r\n");
                    object objSql = "thread" + optObj.ThreadIndex.ToString() + ex. İleti;
                    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();  Set yöntemi, bir iplik bittiğinde işaretlemektir
        }
    }

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

    }





Önceki:net/c# DNS kaçırma nasıl uygulanır
Önümüzdeki:DateTime kullanımı
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com