Artikel ini adalah artikel cermin dari terjemahan mesin, silakan klik di sini untuk melompat ke artikel aslinya.

Melihat: 16438|Jawab: 0

[Formulir Menang] Pengembangan multithread C#

[Salin tautan]
Diposting pada 11/12/2019 12.08.45 | | |
Bisnis yang akan dilakukan adalah mengunduh hampir 40.000 lembar audio dari Alibaba Cloud ke area lokal, dan satu unduhan sangat lambat, jadi saya ingin menggunakan multi-threading, dan mengalokasikan 20 utas untuk diunduh secara bersamaan, menghemat banyak waktu
          Program kelas
    {

        static void Main(string[] args) {
            string sql = "pilih en_audio,us_audio dari t_audio LIMIT 198 ";
            MySqlDataReader mySqlDataReader = DBHelper.ExecuteReader(sql);         
            Daftar<String> sList = Daftar baru <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)
            {
                sementara (mySqlDataReader.Read())
                {                 
                    sList.Add(mySqlDataReader.GetString(0));
                    sList.Add(mySqlDataReader.GetString(1));
                }
            }              
            Console.WriteLine(sList.Count);
            Stopwatch stopwatch = Stopwatch baru();
            stopwatch. Mulai();
            ThreadStart(sList);
            WaitHandle.WaitAll(menunggu);  Semua utas dalam tunggu dengarkan telah diatur sebelum mengeksekusi kode berikut, jika tidak, mereka akan menunggu di sini
            stopwatch. Berhenti();
            Console.WriteLine($"Memakan waktu{stopwatch. ElapsedMilliseconds}milidetik");
            Konsol.BacaKunci();


        }
       utas Thread[] statis = Thread baru[20];
        statis WaitHandle[] menunggu = WaitHandle baru[20];
        void statis publik ThreadStart(Nomor daftar<String>) {
                  Menetapkan utas
            untuk (int i=0; i<20; i++) {
                threads[i] = Thread(DownLoadFile) baru;
                waits[i] = AutoResetEvent baru(false);

            }
                 Tetapkan data ke setiap utas untuk dijalankan dan mulai eksekusi
            untuk (int i = 0; saya < 20; i++)
            {
                jika (i== utas. Panjang-1) {
                    var retult = nums. Lewati (angka. Hitung / 20 * i). Ambil (numula. Jumlah. Hitung / 20*i). ToList();
                    benang[i]. Mulai(baru Objpt()
                    {
                        sList = retult,
                        WaitHandle = menunggu[i],
                        Indeks Utas = i
                    });
                }
                else {
                  var retult= nums. Lewati (angka. Hitung / 20 * i). Ambil (numula. Hitung / 20). ToList();
                    benang[i]. Mulai(baru Objpt() {
                     sList= retult,
                     WaitHandle=menunggu[i],
                     Indeks Utas=i
                    });
                }

            }
        }

        void statis publik DownLoadFile(Objek: obj)
        {
            jumlah int = 0;
            Objpt optObj = (obj sebagai Objpt);
            var sList = optObj.sList;
            Console.WriteLine($"Thread{optObj.ThreadIndex} dimulai";
            foreach (url var di sList)
            {
                Coba
                {
                    hitung++;
                    var arrs = url. Pisah('/');
                    Permintaan WebRequest = WebRequest.Create(url);
                    HttpWebResponse res = (HttpWebResponse)permintaan. GetResponse();
                    Respons WebResponse = permintaan. GetResponse();           
                    jika (res. StatusCode.ToString() == "OK")
                    {
                        Stream responseStream = respons. GetResponseStream();
                        menggunakan (FileStream fsWrite = new FileStream($"F:/Audio/v4/{arrs[arrs. Panjang - 2]}/{arrs[arrs. Panjang - 1]}", FileMode.OpenOrCreate, FileAccess.Write))
                        {
                            byte[] buffer = byte baru[respons. Panjang Konten];
                            sementara (benar)
                            {
                                Mengembalikan jumlah byte yang benar-benar dibaca kali ini
                                int r = responseStream.Read(buffer, 0, buffer. Panjang);
                                jika (r == 0)
                                {
                                    istirahat;
                                }
                                fsWrite.Write(buffer, 0, r); Tulis

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

                }
                tangkap (Pengecualian mis)
                {
                    string strErrorLogFile = System.AppDomain.CurrentDomain.BaseDirectory + $"\\{optObj.ThreadIndex}ErrorLog.log";
                    jika (! Sistem.IO.File.Ada(strErrorLogFile))
                        System.IO.File.WriteAllText(strErrorLogFile, "//System ErrorLog File\r\n");
                    objek objSql = "utas" + optObj.ThreadIndex.ToString() + ex. Pesan;
                    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 sebagai AutoResetEvent). Set();  set adalah untuk menandai saat utas berakhir
        }
    }

     kelas publik Objpt {
        publik Daftar<String> sList { get; menetapkan; }
        publik WaitHandle WaitHandle { get; menetapkan; }
        public int ThreadIndex { get; menetapkan; }

    }





Mantan:net/c# Cara menerapkan pembajakan DNS
Depan:Penggunaan DateTime
Sanggahan:
Semua perangkat lunak, materi pemrograman, atau artikel yang diterbitkan oleh Code Farmer Network hanya untuk tujuan pembelajaran dan penelitian; Konten di atas tidak boleh digunakan untuk tujuan komersial atau ilegal, jika tidak, pengguna akan menanggung semua konsekuensi. Informasi di situs ini berasal dari Internet, dan sengketa hak cipta tidak ada hubungannya dengan situs ini. Anda harus sepenuhnya menghapus konten di atas dari komputer Anda dalam waktu 24 jam setelah pengunduhan. Jika Anda menyukai program ini, harap dukung perangkat lunak asli, pembelian pendaftaran, dan dapatkan layanan asli yang lebih baik. Jika ada pelanggaran, silakan hubungi kami melalui email.

Mail To:help@itsvse.com