Oppgaven som skal gjøres er å laste ned nesten 40 000 lydstykker fra Alibaba Cloud til lokalområdet, og én enkelt nedlasting er veldig treg, så jeg vil bruke multitråding og tildele 20 tråder til nedlasting samtidig, noe som sparer mye tid Klasseprogram {
statisk void Main(string[] args) { streng sql = "velg en_audio,us_audio fra 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"); hvis (mySqlDataReader.HasRows) { mens (mySqlDataReader.Read()) { sList.Add(mySqlDataReader.GetString(0)); sList.Add(mySqlDataReader.GetString(1)); } } Console.WriteLine(sList.Count); Stoppeklokke = ny stoppeklokke(); Stoppeklokke. Start(); ThreadStart(sList); WaitHandle.WaitAll(waits); Alle tråder i lytte-venten er satt før de kan kjøre følgende kode, ellers vil de vente her Stoppeklokke. Stop(); Console.WriteLine($"Time-uping{stopclock. ElapsedMilliseconds}milliseconds"); Console.ReadKey();
} statisk tråd[] tråder = ny tråd[20]; statisk WaitHandle[] waits = ny WaitHandle[20]; offentlig statisk void ThreadStart(List<String> nums) { Tilordne tråder for (int i=0; i<20; i++) { threads[i] = ny tråd(DownLoadFile); waits[i] = ny AutoResetEvent(false);
} Tildel data til hver tråd for å kjøre og starte kjøringen for (int i = 0; Jeg < 20; i++) { hvis (i== tråder. Lengde-1) { var retult = nums. Skip(nums. Tell / 20 * i). Take(nums. Tell-nums. Count / 20*i). ToList(); tråder[i]. Start(ny Objpt() { sList = retult, WaitHandle = waits[i], ThreadIndex = i }); } ellers { var retult= nums. Skip(nums. Tell / 20 * i). Take(nums. Tell / 20). ToList(); tråder[i]. Start(new Objpt() { sList= retult, WaitHandle=waits[i], ThreadIndex=i }); }
} }
offentlig statisk void DownLoadFile(Objekt obj) { int-tall = 0; Objpt optObj = (obj som Objpt); var sList = optObj.sList; Console.WriteLine($"Thread{optObj.ThreadIndex} startet"; foreach (var url i sList) { Prøv { tell++; var arrs = URL. Split('/'); WebRequest-forespørsel = WebRequest.Create(url); HttpWebResponse res = (HttpWebResponse)forespørsel. GetResponse(); WebResponse svar = forespørsel. GetResponse(); hvis (Res. StatusCode.ToString() == "OK") { Stream responseStream = respons. GetResponseStream(); using (FileStream fsWrite = ny FileStream($"F:/Audio/v4/{arrs[arrs. Lengde - 2]}/{arrs[arrs. Lengde - 1]}", FileMode.OpenOrCreate, FileAccess.Write)) { byte[] buffer = ny byte[response. InnholdLengde]; mens (Sant) { Returnerer antall byte som faktisk leses denne gangen int r = responseStream.Read(buffer, 0, buffer. Lengde); hvis (r == 0) { pause; } fsWrite.Write(buffer, 0, r); skriv
} } } hvis (antall % 20 == 0 || antall == sList.Tell) //{ Console.WriteLine($"Thread{optObj.ThreadIndex} prosessert:{count}"); //}
} catch (Unntak f.eks.) { streng strErrorLogFile = System.AppDomain.CurrentDomain.BaseDirectory + $"\\{optObj.ThreadIndex}ErrorLog.log"; hvis (! System.IO.File.Exists(strErrorLogFile)) System.IO.File.WriteAllText(strErrorLogFile, "//System ErrorLog File\r\n"); object objSql = "thread" + optObj.ThreadIndex.ToString() + ex. Melding; 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} avsluttes"); (optObj.WaitHandle som AutoResetEvent). Set(); Mengdemetoden er å markere når en tråd avsluttes } }
public class Objpt { public List<String> sList { get; sett; } public WaitHandle WaitHandle { get; sett; } offentlig int ThreadIndex { get; sett; }
}
|