C#定义问题

时间:2010-10-15 14:56:39

标签: c# definition nullreferenceexception performancecounter

我已将性能计数器定义为:

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时出现此错误:

  

对象引用未设置为   对象的实例。

缺少什么?

3 个答案:

答案 0 :(得分:4)

您需要将实例放在static字段中,并在字段初始值设定项中对其进行初始化。

例如:

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

答案 1 :(得分:0)

如果要在其他类中使用它,可以使类搜索静态,并将其所有字段设置为静态。此外,您应该在使用它之前实例化您的对象“bandwidthCounter”。

答案 2 :(得分:0)

我使用此声明解决了我的问题

public static PerformanceCounter bandwidthCounter;

并在使用此格式后

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

感谢每一个答案