рдкреНрд░рд╛рдЧрд┐рддрд┐рд╣рд╛рд╕
рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдЫреЛрдЯрд╛ рдФрд░ рдЖрд░рд╛рдорджрд╛рдпрдХ рдкрд╛рд▓рддреВ-рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдЗрдВрдЯрд░рдиреЗрдЯ рд╕реЗ рдлрд╛рдЗрд▓реЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рд╕рдореВрд╣реАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рджрд┐рдЦрд╛рдИ рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рд╕рдореВрд╣реАрдХрд░рдгред рдФрд░ рд╕рдВрдкреВрд░реНрдг рдбрд╛рдЙрдирд▓реЛрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ (рдФрд░ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди) рдбреЗрдЯрд╛ рдкрд░ рдЕрддреНрдпрдзрд┐рдХ рдирд┐рд░реНрднрд░ рдереАред рдбреЗрдЯрд╛ рдордХреНрдЦреА рдкрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЕрд░реНрдерд╛рддреНред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдореЗрдВ рдХрд┐рддрдирд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рд╣реИ, рдЗрд╕рдХреА рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред
рдХрдо рд╕реЗ рдХрдо рдХрд┐рд╕реА рддрд░рд╣ рдХреА рд╕реВрдЪрдирд╛ рджреЗрдиреЗ рдХреЗ рдЕрдиреБрднрд╡рд╣реАрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рд░рд▓ рдмрдирд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдкреНрд░рдЧрддрд┐ рдХреЛ рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЕрдиреБрдкрд╛рдд рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ - рд╕рд┐рд░реНрдл рдПрдХ рд░реЗрдВрдЧрдиреЗ рд╡рд╛рд▓реА рдкрдЯреНрдЯреА, рд▓реЗрдХрд┐рди рдпрд╣ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ, рдФрд░ рдпрд╣ рдкреНрд░рдЧрддрд┐ рдХрд╛ рд╕рдВрдХреЗрдд рджрд┐рдП рдмрд┐рдирд╛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд▓реЛрдХрдкреНрд░рд┐рдп рд▓реЛрдбрд┐рдВрдЧ рддрдВрддреНрд░ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред
рдФрд░ рдлрд┐рд░ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИ - рдПрдХ рдмрдбрд╝реЗ рд╕рдореВрд╣ рдореЗрдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреНрд░рдЧрддрд┐ рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рдХреНрдпреЛрдВ рд░реЗрдВрдЧ рд░рд╣реА рд╣реИ - рдХреНрдпрд╛ рдореБрдЭреЗ рдмрд╣реБрдд рд╕рд╛рд░реА рдлрд╛рдЗрд▓реЗрдВ рдпрд╛ рдХрдо рдЧрддрд┐ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ - рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдЧрддрд┐ рдХрд╛рдЙрдВрдЯрд░ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдпрд╣ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХрд╛ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕реА рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдкрд╣рд┐рдпрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рди рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдПред рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдЗрди рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреНрд░рджрд░реНрд╢рди рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдорд╛рди рджрд┐рдЦрддрд╛ рд╣реИ:
рдореБрдЦреНрдп рдмрд┐рдВрджреБ рдЬреЛ рдореИрдВрдиреЗ рдЦреБрдж рдХреЗ рд▓рд┐рдП рдкрд╣рдЪрд╛рдирд╛ рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рд╕рдордп рдореЗрдВ рдЧрддрд┐ рдХреЗ рдкрд╣рд▓реЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рди рдХрд┐ рдХреНрдпрд╛ рдЧрддрд┐ рдФрд╕рдд рдереА, рди рдХрд┐ рдЙрд╕ рдЧрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрдм рдпрд╣ рд╢реБрд░реВ рд╣реБрдЖ рдерд╛, рдЙрд╕ рд╕рдордп рд╕реЗ рдФрд╕рдд рдЧрддрд┐ рдереА, рдЕрд░реНрдерд╛рдд рд╡рд░реНрддрдорд╛рди рд╕рдордп рдореЗрдВ рдпрд╣ рдЖрдВрдХрдбрд╝рд╛ рдХреНрдпрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдЬрдм рдореБрдЭреЗ рдХреЛрдб рдорд┐рд▓рддрд╛ рд╣реИ - рдореИрдВ рдЗрд╕реЗ рдЕрд▓рдЧ рд╕реЗ рд╕рдордЭрд╛рдКрдВрдЧрд╛ред
рддреЛ, рд╣рдореЗрдВ рдПрдХ рд╕рд░рд▓ рдЕрдВрдХ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕реЗ 10 MB/s
рдпрд╛ рдРрд╕рд╛ рдХреБрдЫред рд╣рдо рдЗрд╕рдХреА рдЧрдгрдирд╛ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ?
рд╕рд┐рджреНрдзрд╛рдВрдд рдФрд░ рдЕрднреНрдпрд╛рд╕
рдореМрдЬреВрджрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдиреЗ HttpWebRequest
рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдФрд░ рдореИрдВрдиреЗ рд╕реНрд╡рдпрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ - рдХрд╛рд░реНрдп рддрдВрддреНрд░ рдХреЛ рд╕реНрдкрд░реНрд╢ рди рдХрд░реЗрдВред
рдЗрд╕рд▓рд┐рдП, рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЧрдгрдирд╛ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
var request = WebRequest.Create(uri); var response = await request.GetResponseAsync(); using (var ms = new MemoryStream()) { await response.GetResponseStream().CopyToAsync(ms); return ms.ToArray(); }
рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдкреАрдЖрдИ рдХреЗ рд╕реНрддрд░ рдкрд░, рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдкреВрд░реНрдг рдбрд╛рдЙрдирд▓реЛрдб рдХрд╛ рдЬрд╡рд╛рдм рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЫреЛрдЯреЗ рд╕рдореВрд╣реЛрдВ рдХреЗ рд▓рд┐рдП (рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП) рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧрддрд┐ рдХреА рдЧрдгрдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рд╣рдо CopyToAsync рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣рд╛рдВ рд╕реЗ рд╕рд░рд▓ рддрд░реНрдХ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдХрд░рддреЗ рд╣реИрдВ:
byte[] buffer = new byte[bufferSize]; int bytesRead; while ((bytesRead = await ReadAsync(buffer, 0, buffer.Length, cancellationToken).ConfigureAwait(false)) != 0) { await destination.WriteAsync(buffer, 0, bytesRead, cancellationToken).ConfigureAwait(false); }
рдЕрдм рд╣рдо рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд╣рдореЗрдВ рджрд┐рдП рдЧрдП рд╣рд░ рдмрдлрд░ рдХрд╛ рдЬрд╡рд╛рдм рджреЗ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо BoxToAsync рдХреЗ рдмрдЬрд╛рдп рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ:
public static async Task<byte[]> GetBytesAsync(this Stream from) { using (var memory = new MemoryStream()) { byte[] buffer = new byte[81920]; int bytesRead; while ((bytesRead = await from.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false)) != 0) { await memory.WriteAsync(buffer, 0, bytesRead).ConfigureAwait(false); NetworkSpeed.AddInfo(bytesRead); } return memory.ToArray(); } }
рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬреЛрдбрд╝реА рдЧрдИ рд╣реИ NetworkSpeed.AddInfo
ред рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬрд┐рд╕реЗ рд╣рдо рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рд╣реИ рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИред
рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
var request = WebRequest.Create(uri); var response = await request.GetResponseAsync(); var array = await response.GetResponseStream().GetBytesAsync();
WebClient рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк var client = new WebClient(); var lastRecorded = 0L; client.DownloadProgressChanged += (sender, eventArgs) => { NetworkSpeed.AddInfo(eventArgs.BytesReceived - lastRecorded); lastRecorded = eventArgs.BytesReceived; }; var array = await client.DownloadDataTaskAsync(uri);
HttpClient рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк var httpClient = new HttpClient(); var content = await httpClient.GetStreamAsync(uri); var array = await content.GetBytesAsync();
рдЦреИрд░, рдЖрдзреА рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ рд╣реИ - рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдордиреЗ рдХрд┐рддрдирд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ред рд╣рдо рдЧрддрд┐ рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВред
рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░:
рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рджрд░ - рд╕рдордп рдХреА рдкреНрд░рддрд┐ рдпреВрдирд┐рдЯ рдкреНрд░реЗрд╖рд┐рдд рдбреЗрдЯрд╛ рдХреА рдорд╛рддреНрд░рд╛ред
рдкрд╣рд▓рд╛ рдЕрдиреБрднрд╡рд╣реАрди рджреГрд╖реНрдЯрд┐рдХреЛрдг
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡реЙрд▓реНрдпреВрдо рд╣реИред рд╕рдордп рдХреЛ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рд╕реЗ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ DateTime.Now
рд╕рд╛рде рдЕрдВрддрд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЛ рдФрд░ рд╢реЗрдпрд░ рдХрд░реЛ?
рдХрдВрд╕реЛрд▓ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдЬреИрд╕реЗ рдХрд░реНрд▓ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдФрд░ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХрд╛ рдЖрд╡реЗрджрди рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рддреЛ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рдард╣рд░рд╛рд╡ рдмрдЯрди рдирд╛рдЯрдХреАрдп рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рдЬреАрд╡рди рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛ рджреЗрдЧрд╛ред
рдард╣рд░рд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛
рд╢рд╛рдпрдж рдореИрдВ рдмрд╣реБрдд рднреЛрд▓рд╛ рд╣реВрдБ, рдпрд╛ рд╢рд╛рдпрдж рд╕рд╡рд╛рд▓ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ - рд▓реЗрдХрд┐рди рдард╣рд░рд╛рд╡ рдореБрдЭреЗ рд▓рдЧрд╛рддрд╛рд░ рд╕реЛрдЪрдиреЗ рдкрд░ рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рдПрдХ рдард╣рд░рд╛рд╡ рдХрдо рд╕реЗ рдХрдо рддреАрди рддрд░реАрдХреЛрдВ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:
- рдЗрдВрдЯрд░рдкреНрдЯ рдлрд╛рдЗрд▓ рдЕрдкрд▓реЛрдб, рдЗрд╕рдХреЗ рдмрд╛рдж рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ
- рдмрд╕ рдЖрдЧреЗ рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рди рдХрд░реЗрдВ, рдЖрд╢рд╛ рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рдХреЗ рдмрд╛рдж рднреА рдЬрд╛рд░реА рд░рд╣реЗрдЧрд╛
- рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓реЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ, рдирдП рдбрд╛рдЙрдирд▓реЛрдб рди рдХрд░реЗрдВ, рдирдП рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ
рдЪреВрдВрдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдиреБрдХрд╕рд╛рди рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рджреЛ рдиреЗрддреГрддреНрд╡, рдореИрдВ рддреАрд╕рд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред
рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ, рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдЧрддрд┐ рдХреЛ рдПрдХ рдмрд┐рдВрджреБ рдкрд░ рдареАрдХ рд╕рдордп рдкрд░ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рддреЛ, рдПрдХ рд╡рд┐рд░рд╛рдо рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рддрд╛ рд╣реИ:
- рдЖрдк рдареАрдХ рд╕реЗ рдЧрдгрдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХрд┐ рдФрд╕рдд рдЧрддрд┐ рдХреНрдпрд╛ рдереА, рдмрд╕ рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рд╡реЙрд▓реНрдпреВрдо рд▓реЗ рд░рд╣рд╛ рдерд╛
- рдПрдХ рдард╣рд░рд╛рд╡ рдХреЗ рдмрд╛рд╣рд░реА рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЧрддрд┐ рдФрд░ рдЪреИрдирд▓ рдХреЛ рдмрджрд▓ рджреЗрдВрдЧреЗ (рдкреНрд░рджрд╛рддрд╛ рдХреЗ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛, рд╡реАрдкреАрдПрди рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛, рдкреВрд░реЗ рдЪреИрдирд▓ рдХреЛ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ uTorrent рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛), рдЬрд┐рд╕рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЧрддрд┐ рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╣реЛрдЧрд╛
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рдард╣рд░рд╛рд╡ рдХрд┐рд╕реА рднреА рд╕рдВрдХреЗрддрдХ рдХреЛ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдмрд╕ рдПрдХ рдорд┐рдирдЯ рдХреА рдордЬреЗрджрд╛рд░ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдПред
рджреВрд╕рд░рд╛ рднреЛрд▓рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг
рдПрдХ рдЯрд╛рдЗрдорд░ рдЬреЛрдбрд╝реЗрдВред рдЯрд╛рдЗрдорд░ рд╣рд░ рдмрд╛рд░ рдХреА рдЕрд╡рдзрд┐ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдорд╛рддреНрд░рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдирд╡реАрдирддрдо рдЬрд╛рдирдХрд╛рд░реА рд▓реЗрдЧрд╛ рдФрд░ рд╕реНрдкреАрдб рдЗрдВрдбрд┐рдХреЗрдЯрд░ рдХреЛ рдкреБрди: рдЧрдгрдирд╛ рдХрд░реЗрдЧрд╛ред рдФрд░ рдпрджрд┐ рдЖрдк рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдЯрд╛рдЗрдорд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП рд╡реЙрд▓реНрдпреВрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрд╕ рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рдЗрд╕ рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рдЧрддрд┐ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧреА:
рд╕рдВрдкреВрд░реНрдг NetworkSpeed тАЛтАЛрд╡рд░реНрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди public class NetworkSpeed { public static double TotalSpeed { get { return totalSpeed; } } private static double totalSpeed = 0; private const uint TimerInterval = 1000; private static Timer speedTimer = new Timer(state => { var now = 0L; while (ReceivedStorage.TryDequeue(out var added)) now += added; totalSpeed = now; }, null, 0, TimerInterval); private static readonly ConcurrentQueue<long> ReceivedStorage = new ConcurrentQueue<long>(); public static void Clear() { while (ReceivedStorage.TryDequeue(out _)) { } totalSpeed = 0; } public static void AddInfo(long received) { ReceivedStorage.Enqueue(received); } }
рдкрд╣рд▓реЗ рд╡рд┐рдХрд▓реНрдк рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдПрдХ рд╡рд┐рд░рд╛рдо рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдирд╛ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ - рдбреЗрдЯрд╛ рдЖрдиреЗ рдХреЗ рдмрд╛рдж рдЕрдЧрд▓реЗ рд╕реЗрдХрдВрдб рдореЗрдВ рдЧрддрд┐ 0 рддрдХ рдЧрд┐рд░ рдЬрд╛рддреА рд╣реИред
рд▓реЗрдХрд┐рди, рдЗрд╕рдХреЗ рдиреБрдХрд╕рд╛рди рднреА рд╣реИрдВред рд╣рдо 80kb рдХреЗ рдмрдлрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдПрдХ рд╕реЗрдХрдВрдб рдореЗрдВ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХреЗрд╡рд▓ рдЕрдЧрд▓реЗ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдЧрд╛ред рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдПрдХ рдмрдбрд╝реА рдзрд╛рд░рд╛ рдХреЗ рд╕рд╛рде, рдРрд╕реА рдорд╛рдк рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдХреБрдЫ рднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреА - рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ 30% рддрдХ рдХрд╛ рдкреНрд░рд╕рд╛рд░ рдерд╛ред рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди 100 рд╕реЗ рдЕрдзрд┐рдХ Mbit рдмрд╣реБрдд рд╕рдВрджрд┐рдЧреНрдз рд▓рдЧ рд░рд╣реЗ рдереЗ ред
рддреАрд╕рд░рд╛ рддрд░реАрдХрд╛
рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдЪреНрдЪрд╛рдИ рдХреЗ рдХрд╛рдлреА рдХрд░реАрдм рд╣реИ, рд╕рд╛рде рд╣реА рдбрд╛рдЙрдирд▓реЛрдб рдХреЗ рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ рдЙрд╕рдХреА рддреНрд░реБрдЯрд┐ рдЕрдзрд┐рдХ рджреЗрдЦреА рдЧрдИ, рдФрд░ рдЬреАрд╡рди рдЪрдХреНрд░ рдХреЗ рджреМрд░рд╛рди рдирд╣реАрдВред
рдЗрд╕рд▓рд┐рдП, рдПрдХ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рдПрдХ рд╕рдВрдХреЗрддрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдирд╛ рд╣реИ рдЬреЛ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдЖрдВрдХрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд┐рдЫрд▓реЗ рддреАрди рд╕реЗрдХрдВрдб рдореЗрдВ рдФрд╕рдд рд╣реИред рдпрд╣рд╛рдВ рддреАрди рдЖрдВрдЦ рд╕реЗ рдорд┐рд▓рд╛рди рдПрдХ рдЬрд╛рджреВ рдирд┐рд░рдВрддрд░ рд╣реИред рдПрдХ рддрд░рдл, рдореИрдВ рдЧрддрд┐ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдФрд░ рдЧрд┐рд░рд╛рд╡рдЯ рдХрд╛ рдПрдХ рд╕реБрдЦрдж рдкреНрд░рджрд░реНрд╢рди рдЪрд╛рд╣рддрд╛ рдерд╛, рджреВрд╕рд░реА рддрд░рдл - рддрд╛рдХрд┐ рдЧрддрд┐ рд╕рдЪреНрдЪрд╛рдИ рдХреЗ рдХрд░реАрдм рдереАред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ:
рд╕рдВрдкреВрд░реНрдг NetworkSpeed тАЛтАЛрд╡рд░реНрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди public class NetworkSpeed { public static double TotalSpeed { get { return totalSpeed; } } private static double totalSpeed = 0; private const uint Seconds = 3; private const uint TimerInterval = 1000; private static Timer speedTimer = new Timer(state => { var now = 0L; while (ReceivedStorage.TryDequeue(out var added)) now += added; LastSpeeds.Enqueue(now); totalSpeed = LastSpeeds.Average(); OnUpdated(totalSpeed); }, null, 0, TimerInterval); private static readonly LimitedConcurrentQueue<double> LastSpeeds = new LimitedConcurrentQueue<double>(Seconds); private static readonly ConcurrentQueue<long> ReceivedStorage = new ConcurrentQueue<long>(); public static void Clear() { while (ReceivedStorage.TryDequeue(out _)) { } while (LastSpeeds.TryDequeue(out _)) { } totalSpeed = 0; } public static void AddInfo(long received) { ReceivedStorage.Enqueue(received); } public static event Action<double> Updated; private class LimitedConcurrentQueue<T> : ConcurrentQueue<T> { public uint Limit { get; } public new void Enqueue(T item) { while (Count >= Limit) TryDequeue(out _); base.Enqueue(item); } public LimitedConcurrentQueue(uint limit) { Limit = limit; } } private static void OnUpdated(double obj) { Updated?.Invoke(obj); } }
рдХреБрдЫ рдмрд┐рдВрджреБ:
- рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рдордп, рдореБрдЭреЗ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдПрдХ рд╕реАрдорд╛ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рдХрддрд╛рд░ рдирд╣реАрдВ рдорд┐рд▓реА рдФрд░ рдЗрд╕реЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рд▓реЗ рд▓рд┐рдпрд╛, рдЗрд╕рдХреЗ рдКрдкрд░ рдХреЗ рдХреЛрдб рдореЗрдВ
LimitedConcurrentQueue
ред - рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ
INotifyPropertyChanged
рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, Action
, рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдорд╛рди рд╣реИ, рдореБрдЭреЗ рдЗрд╕рдХреЗ рдХрд╛рд░рдг рдпрд╛рдж рдирд╣реАрдВ рд╣реИрдВред рддрд░реНрдХ рд╕рд░рд▓ рд╣реИ - рд╕рдВрдХреЗрддрдХ рдмрджрд▓ рд░рд╣рд╛ рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛрдИ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ IObservable
, рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
рдФрд░ рдереЛрдбрд╝реА рдкрдардиреАрдпрддрд╛
рдПрдкреАрдЖрдИ рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдЧрддрд┐ рджреЗрддрд╛ рд╣реИ, рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ (рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛) рдЙрдкрдпреЛрдЧреА рд╣реИ
рдХрдирд╡рд░реНрдЯрд░ public static string HumanizeByteSize(this long byteCount) { string[] suf = { "B", "KB", "MB", "GB", "TB", "PB", "EB" };
рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдЧрддрд┐, рдЕрд░реНрдерд╛рддреНред рдкреНрд░рддрд┐ 100mbit рдЪреИрдирд▓ рдХреЛ 12.5MB рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рдЬрд╛рд░реА рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрд╣ рдЕрдВрддрддрдГ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
Ubuntu рдЫрд╡рд┐ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВрд╡рд░реНрддрдорд╛рди рдЧрддрд┐ 904.5KB / s
рд╡рд░реНрддрдорд╛рди рдЧрддрд┐ 1.8MB / s
рд╡рд░реНрддрдорд╛рди рдЧрддрд┐ 2.9MB / s
рд╡рд░реНрддрдорд╛рди рдЧрддрд┐ 3.2MB / s
рд╡рд░реНрддрдорд╛рди рдЧрддрд┐ 2.9MB / s
рд╡рд░реНрддрдорд╛рди рдЧрддрд┐ 2.8 рдПрдордмреА / рдПрд╕
рд╡рд░реНрддрдорд╛рди рдЧрддрд┐ 3 рдПрдордмреА / рдПрд╕
рд╡рд░реНрддрдорд╛рди рдЧрддрд┐ 3.1MB / s
рд╡рд░реНрддрдорд╛рди рдЧрддрд┐ 3.2MB / s
рд╡рд░реНрддрдорд╛рди рдЧрддрд┐ 3.3MB / s
рд╡рд░реНрддрдорд╛рди рдЧрддрд┐ 3,5MB / s
рд╡рд░реНрддрдорд╛рди рдЧрддрд┐ 3.6 рдПрдордмреА / рдПрд╕
рд╡рд░реНрддрдорд╛рди рдЧрддрд┐ 3.6 рдПрдордмреА / рдПрд╕
рд╡рд░реНрддрдорд╛рди рдЧрддрд┐ 3.6 рдПрдордмреА / рдПрд╕
...
рдЦреИрд░, рдПрдХ рдмрд╛рд░ рдореЗрдВ рдХрдИ рдЪрд┐рддреНрд░рд╡рд░реНрддрдорд╛рди рдЧрддрд┐ 1,2MB / s
рд╡рд░реНрддрдорд╛рди рдЧрддрд┐ 3.8MB / s
рд╡рд░реНрддрдорд╛рди рдЧрддрд┐ 7.3MB / s
рд╡рд░реНрддрдорд╛рди рдЧрддрд┐ 10 рдПрдордмреА / рдПрд╕
рд╡рд░реНрддрдорд╛рди рдЧрддрд┐ 10.3MB / s
рд╡рд░реНрддрдорд╛рди рдЧрддрд┐ 10 рдПрдордмреА / рдПрд╕
рд╡рд░реНрддрдорд╛рди рдЧрддрд┐ 9.7MB / s
рд╡рд░реНрддрдорд╛рди рдЧрддрд┐ 9.8MB / s
рд╡рд░реНрддрдорд╛рди рдЧрддрд┐ 10.1MB / s
рд╡рд░реНрддрдорд╛рди рдЧрддрд┐ 9.8MB / s
рд╡рд░реНрддрдорд╛рди рдЧрддрд┐ 9.1MB / s
рд╡рд░реНрддрдорд╛рди рдЧрддрд┐ 8.6MB / s
рд╡рд░реНрддрдорд╛рди рдЧрддрд┐ 8.4MB / s
...
рдирд┐рд╖реНрдХрд░реНрд╖
рдпрд╣ рдЧрд┐рдирддреА рдХреА рдЧрддрд┐ рдХреЗ рдПрдХ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдп рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рдерд╛ред рдФрд░ рднрд▓реЗ рд╣реА рдХреЛрдб рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдирдВрдмрд░ рджреЗрддрд╛ рд╣реИ, рдореИрдВ рдЖрд▓реЛрдЪрдХреЛрдВ рдХреЛ рд╕реБрдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ - рдореИрдВрдиреЗ рдХреНрдпрд╛ рдпрд╛рдж рдХрд┐рдпрд╛, рдореИрдВ рдХреИрд╕реЗ рдмреЗрд╣рддрд░ рдХрд░ рд╕рдХрддрд╛ рдерд╛, рд╢рд╛рдпрдж рдХреБрдЫ рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рд╣реИрдВред
рдореИрдВ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд░реВрд╕реА рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡реНрд▓рд╛рдб-рдПрдХреНрд╕рдмреНрд░рдмрд┐рдЯ - рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рдЕрдЪреНрдЫреЗ рд╕рд╡рд╛рд▓ рдХрд╛ рдЖрдзрд╛ рдЬрд╡рд╛рдм рд╣реИ, рдХреЛрдИ рд╕рдВрдХреЗрдд рдФрд░ рдХреЛрдИ рдорджрдж рд╣рдореЗрд╢рд╛ рдЖрдкрдХреЛ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреА рд╣реИред
рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрдХ рдкрд╛рд▓рддреВ-рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ - рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╡рд░реНрдЧ рд╕реНрдерд┐рд░ рдФрд░ рдПрдХ рдмрд┐рд▓реНрдХреБрд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдЯреАрдХрддрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдмрд╣реБрдд рд╕реА рдЫреЛрдЯреА рдЪреАрдЬреЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдЬреЛ рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди ... рд╣рдореЗрд╢рд╛ рдХреБрдЫ рдФрд░ рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдм рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЧрддрд┐ рд╣реИ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред