Страницы

Поиск по вопросам

воскресенье, 29 декабря 2019 г.

Найти общий объем загруженной информации приложением на c#

#c_sharp #winforms #сеть #трафик


Есть приложение winforms на c#. Иногда оно обращается с запросами к разным интернет
ресурсам, получает ответы. Можно ли как-то узнать, сколько Mb было скачано за одну
сессию работы с приложением. То есть мне нужно просто узнать объем траффика через мое
приложение. Спасибо
    


Ответы

Ответ 1



Можно использовать счетчики производительности .NET CLR Networking. Для этого необходимо включить в раздел configuration файла app.config следующий элемент: Счетчики позволяют получить количество байт, отправленных и полученных средствами классов .NET, для указанного процесса. Создадим вспомогательный класс: using System; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.Threading; using System.Net; using System.Text; namespace WinformsTest { public class NetworkStats { const string CategoryName = ".NET CLR Networking 4.0.0.0";//В .NET 2.0-3.5 заменить на ".NET CLR Networking" static PerformanceCounter _sentcounter = null; static PerformanceCounter _recvcounter = null; public static long BytesSent { get { if (_sentcounter == null) throw new InvalidOperationException("Class not initialized"); return _sentcounter.RawValue; } } public static long BytesReceived { get { if (_recvcounter == null) throw new InvalidOperationException("Class not initialized"); return _recvcounter.RawValue; } } public static bool Initialize() { //устанавливаем культуру, чтобы иметь предсказуемое имя счетчика CultureInfo ci = Thread.CurrentThread.CurrentCulture; Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture; try { var category = new PerformanceCounterCategory(CategoryName); //для активации счетчиков нужно отправить хотя бы один запрос, неважно успешный или нет try { WebClient cl = new WebClient(); string html = cl.DownloadString("http://example.com"); Debug.WriteLine(html.Length); } catch (Exception ex) { Debug.WriteLine(ex.Message); } //получаем имя процесса Process pr = Process.GetCurrentProcess(); string prname = ""; using (pr) { prname = (pr.ProcessName.ToLower()); } var instances = category.GetInstanceNames(); //находим экземпляр счетчика для процесса string instance = ""; foreach (string s in instances) { if (s.ToLower().Contains(prname)) instance = s; } if (instance == "") return false; //создаем счетчики _sentcounter = new PerformanceCounter(CategoryName, "Bytes Sent", instance, true); _recvcounter = new PerformanceCounter(CategoryName, "Bytes Received", instance, true); return true; } finally { //возвращаем исходную культуру Thread.CurrentThread.CurrentCulture = ci; Thread.CurrentThread.CurrentUICulture = ci; } } } } Пример использования: public partial class Form1 : Form { public Form1() { InitializeComponent(); if (NetworkStats.Initialize() == false) { MessageBox.Show("NetworkStats.Initialize failed"); return; } timer1.Enabled = true; } public string PerformRequest(string url) { WebClient cl = new WebClient(); string html = cl.DownloadString(url); return html; } private void button1_Click(object sender, EventArgs e) { string s = PerformRequest("http://yandex.ru"); MessageBox.Show(s.Substring(0,300)); } private void timer1_Tick(object sender, EventArgs e) { textBox1.Text = "Bytes sent: " + NetworkStats.BytesSent.ToString() + "; Bytes received: " + NetworkStats.BytesReceived.ToString(); } }

Комментариев нет:

Отправить комментарий