2010-10-15 54 views
0

我已經定義了一個性能計數器爲:C#定義問題

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

PerformanceCounter bandwidthCounter = new PerformanceCounter("Network Interface", "Current Bandwidth", instance, ipAddress); 
在我的代碼

,但我想它定義全球和不同功能的使用,所以我改變了代碼:

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(); 
        } 

       }    
      } 
     } 
    } 
} 

,然後當我使用bandwidthCounter我得到這個錯誤:

Object reference not set to an instance of an object.

缺少什麼?

+0

你'bandwidthCounter。*'代碼是住在後茫茫荒野。你可以更新你的問題,讓它住在一個真實的位置?此外,您還會顯示初始化「bandwidthCounter」的代碼,但再次不會顯示*代碼所在的位置。 – 2010-10-15 15:04:53

+0

現在你是「getperformance」方法,它生活在無處不在的地步。由於我認爲這是執行問題的順序,所以這非常重要。那'bandwidthCounter = new PerformanceCounter(...)'代碼在哪裏呢? – 2010-10-15 15:11:08

+0

我已經編輯了我的文章,我把類代碼al – Rapunzo 2010-10-16 07:58:43

回答

0

我已經解決了我的使用問題,這個聲明

public static PerformanceCounter bandwidthCounter; 

和使用這種格式

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

感謝每一個答案

4

您需要將該實例放入static字段中,並在字段初始值設定項中將其初始化。

例如:

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

如果你想用它在其他類可以使類搜索靜態和所有的字段靜態爲好。你也應該在玩之前實例化你的對象「bandwidthCounter」。

+0

我已經修改了我的文章給你,關於實例定義,你可以再看一遍。 – Rapunzo 2010-10-15 15:07:29

+0

bandwidthCounter未初始化...只是使用defualt構造函數:PerformanceCounter bandwidthCounter = new PerformanceCounter(); – Bogdan 2010-10-15 15:11:44