Страницы

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

пятница, 14 декабря 2018 г.

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

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


Ответ

Можно использовать счетчики производительности .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(); } }

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

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