0

J'ai défini un compteur de performance:C problème # définition

PerformanceCounterCategory pcc = new PerformanceCounterCategory("Network Interface", ipAddress); 
string instance = pcc.GetInstanceNames()[1]; //first card 

PerformanceCounter bandwidthCounter = new PerformanceCounter("Network Interface", "Current Bandwidth", instance, ipAddress); 

dans mon code, mais je veux le définir dans les différentes fonctions et l'utilisation mondiales, donc je changé le code:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net; 
using System.Collections; 
using System.Diagnostics; 
using System.Windows.Forms; 
using System.Net.NetworkInformation; 
using System.Management; 

namespace networkPerformans 
{ 
    class Searcher 
    { 
     ConnectionClassOleDb cc = new ConnectionClassOleDb(); 
     int threadNo, range, step, modJobs; 
     frmIpTarama frm; 
     ArrayList tmpList = new ArrayList(); 
     DateTime endTime, startTime; 
     ListViewItem x; 
     long pingSuresi; 
     string machineName; 
     double utilization;  

     public Searcher(int threadNo, frmIpTarama frm) 
     { 
      this.threadNo = threadNo; 
      this.frm = frm; 
     } 

     public void getIpRange() 
     { 
      frm.calcIpAddressRange(); 

      if (frm.calcIpAddressRange()) 
      { 
       range = frm.intEndIp - frm.intStartIp + 1; // 13 - 1 = 12 + 1 = 13 
       step = range/(int)frm.nudThreads.Value; // 13/5 = 2 
       modJobs = (range % frm.threadSayac);  // 13 mod 5 kalan= 3+ 

       frm.lblGorev.Text = range.ToString(); 


       if (threadNo <= modJobs) 
       { 
        step++; 
       } 

       int i = 0; 
       int currentIp; 
       while (i < step) 
       { 

        currentIp = (threadNo) + (frm.threadSayac * i) + frm.intStartIp; 
        string ipAddress = new IPAddress(BitConverter.GetBytes(IPAddress.NetworkToHostOrder(currentIp))).ToString(); 

        if (currentIp <= frm.intEndIp) 
        {      
         getperformance(ipAddress, threadNo);       
        } 
        else 
        { 
         break; 
        } 
        i++; 
       } 
      } 
     } 

     public string pingStatus(string ip) 
     { 
      Ping p = new Ping(); 
      PingReply reply = p.Send(ip); 
      pingSuresi = reply.RoundtripTime; 
      return reply.Status.ToString(); 

     } 

     public void getperformance(string ipAddress, int threadNo) 
     { 
      string pingDurumu = pingStatus(ipAddress); 
      bool veriGoster = frm.cbVerileriGosterme.Checked; 

      if (pingDurumu == IPStatus.Success.ToString()) 
      { 
       if (!veriGoster) 
       { 
        x = frm.lvAddresses.Items.Add(ipAddress); 
        x.SubItems.AddRange(new String[] { "", "", "", "", "", "", "", "", "" }); 
       } 

       try 
       { 
        startTime = DateTime.Now; 
        PerformanceCounterCategory pcc = new PerformanceCounterCategory("Network Interface", ipAddress); 

        string instance = pcc.GetInstanceNames()[1]; // 1. network kartı 

        PerformanceCounter bandwidthCounter = new PerformanceCounter("Network Interface", "Current Bandwidth", instance, ipAddress); 
        PerformanceCounter pcReceived = new PerformanceCounter("Network Interface", "Bytes Received/sec", instance, ipAddress);   
        PerformanceCounter pcSent = new PerformanceCounter("Network Interface", "Bytes Sent/sec", instance, ipAddress); 
        PerformanceCounter pcProcessorTime = new PerformanceCounter("Processor", "% Processor Time", "_Total", ipAddress); 
        PerformanceCounter pcKullanilabilirRam = new PerformanceCounter("Memory", "Available MBytes", "", ipAddress); 

        const int numberOfIterations = 10; 
        float receiveSum = 0; 
        float sendSum = 0; 
        float cpuSum = 0; 

        float bandwidth = bandwidthCounter.NextValue(); 

        for (int index = 0; index < numberOfIterations; index++) 
        { 
         sendSum += pcSent.NextValue(); 
         receiveSum += pcReceived.NextValue(); 
         cpuSum += pcProcessorTime.NextValue(); 
        } 

        float dataSent = sendSum; 
        float dataReceived = receiveSum; 
        //MessageBox.Show(dataSent.ToString() +" "+ dataReceived.ToString()); 
        if ((dataSent != 0) && (dataReceived != 0)) 
        { 
         utilization = (8 * (dataSent + dataReceived))/(bandwidth * numberOfIterations) * 100; 
        } 
        else 
        { 
         string instance2 = pcc.GetInstanceNames()[0]; 
         PerformanceCounter bandwidthCounter2 = new PerformanceCounter("Network Interface", "Current Bandwidth", instance2, ipAddress); 
         PerformanceCounter pcReceived2 = new PerformanceCounter("Network Interface", "Bytes Received/sec", instance2, ipAddress); 
         PerformanceCounter pcSent2 = new PerformanceCounter("Network Interface", "Bytes Sent/sec", instance2, ipAddress); 

         float bandwidth2 = bandwidthCounter2.NextValue(); 

         for (int index = 0; index < numberOfIterations; index++) 
         { 
          sendSum += pcSent2.NextValue(); 
          receiveSum += pcReceived2.NextValue(); 
          cpuSum += pcProcessorTime.NextValue(); 
         } 

         float dataSent2 = sendSum; 
         float dataReceived2 = receiveSum; 
         utilization = (8 * (dataSent2 + dataReceived2))/(bandwidth2 * numberOfIterations) * 100; 



        } 

        cpuSum = cpuSum/numberOfIterations; 

        IPHostEntry host = new IPHostEntry(); 
        host = Dns.GetHostEntry(ipAddress);//ip Address is to be specified here 
        machineName = host.HostName; 

        endTime = DateTime.Now; 

        if (!frm.cbVerileriGosterme.Checked) 
        { 
         x.SubItems[1].Text = machineName; 
         x.SubItems[2].Text = threadNo.ToString(); 
         x.SubItems[3].Text = pingDurumu; 
         x.SubItems[4].Text = pingSuresi.ToString(); 
         x.SubItems[5].Text = (endTime - startTime).TotalSeconds.ToString(); 
         x.SubItems[6].Text = utilization.ToString(); 
         x.SubItems[7].Text = cpuSum.ToString(); 
         x.SubItems[8].Text = pcKullanilabilirRam.NextValue().ToString(); 
         x.SubItems[9].Text = ""; 
        } 


        cc.sorgu = " EXECUTE [dbo].[prVeriKaydet] " 
         + "'" + frm.taramaNo + "'," 
         + "'" + ipAddress + "'," 
         + "'" + machineName + "'," 
          + pingSuresi.ToString().Replace(",", ".") + "," 
          + (endTime - startTime).TotalSeconds.ToString().Replace(",", ".") + "," 
          + utilization.ToString().Replace(",", ".") + "," 
          + cpuSum.ToString().Replace(",", ".") + "," 
          + pcKullanilabilirRam.NextValue().ToString().Replace(",", "."); 


        cc.Run(cc.sorgu, ""); 


       } 
       catch (Exception ex) 
       { 
        endTime = DateTime.Now; 

        if (!veriGoster) 
        { 
         x.SubItems[2].Text = threadNo.ToString(); 
         x.SubItems[3].Text = pingDurumu; 
         x.SubItems[4].Text = pingSuresi.ToString(); 
         x.SubItems[5].Text = (endTime - startTime).TotalSeconds.ToString(); 
         x.SubItems[5].Text = "0"; 
         x.SubItems[6].Text = "0"; 
         x.SubItems[7].Text = "0"; 
         x.SubItems[8].Text = "0"; 
         x.SubItems[9].Text = ex.Message; 
        } 

       } 
      } 

      lock (frm.progressBar1) 
      { 
       frm.progressBar1.Value++; 
       frm.lblIs.Text = frm.progressBar1.Value.ToString(); 

       if (range - frm.nudThreads.Value < frm.progressBar1.Value) 
       { 
        frm.threadSayacKontrol--; 
       } 

       frm.tbThreadSayisi.Text = frm.threadSayacKontrol.ToString(); 

       if (frm.progressBar1.Value == frm.progressBar1.Maximum) 
       { 
        frm.progressBar1.Value = 0; 
        frm.btnTara.Enabled = true; 
        frm.TheColumnSorter.CurrentColumn = 0; 
        frm.btnDurdurDevam.Enabled = false;      

        if (frm.cbSurekliTara.Checked) 
        { 
         frm.tara(); 
        } 

       }    
      } 
     } 
    } 
} 

puis quand je l'utilise bandwidthCounter je reçois cette erreur:

Object reference not set to an instance of an object.

Qu'est-ce qui manque?

+0

Votre code 'bandwidthCounter. *' Vit dans la au milieu de nulle part. Pouvez-vous mettre à jour votre question afin qu'elle se trouve dans un endroit réel? En outre, vous montrez le code qui initialise 'bandwidthCounter' mais encore une fois, ne nous montrez pas où * ce * code vit non plus. –

+0

maintenant vous êtes méthode getperformance est vivant au milieu de nulle part. Comme je crois que c'est un problème d'ordre d'exécution, c'est très important. Et d'où vient ce 'bandwidthCounter = new PerformanceCounter (...)' code live? –

+0

J'ai encore édité mon poste et j'ai mis tous les codes dans la classe – Rapunzo

Répondre

0

J'ai résolu mon problème que l'utilisation de cette déclaration

public static PerformanceCounter bandwidthCounter; 

et après l'utilisation de ce format

bandwidthCounter = new PerformanceCounter("Network Interface", "Current Bandwidth", instance, ipAddress); 

grâce à toutes les réponses

4

Vous devez placer l'instance dans un champ static et l'initialiser dans l'initialiseur de champ.

Par exemple:

static PerformanceCounter bandwidthCounter 
    = new PerformanceCounter("Network Interface", "Current Bandwidth", instance, ipAddress); 
0

Si vous voulez l'utiliser dans d'autres classes que vous pouvez faire une recherche de classe statique et tous ses champs statiques ainsi. De plus, vous devriez instancier votre objet "bandwidthCounter" avant de jouer avec.

+0

J'ai modifié mon post pour vous, à propos de la définition d'instance, vous pouvez regarder à nouveau. – Rapunzo

+0

bandwidthCounter n'est pas initialisé ... utilisez simplement le constructeur defualt: PerformanceCounter bandwidthCounter = new PerformanceCounter(); – Bogdan