问题:有一批静态IP,要对其是否通路状态进行PING命令。声明一个Ping的实例p1,然后在一个循环里连续调用SendAsync方法,则会报出错误【异步调用已在进行中。必须先完成或者取消此调用,然后才能调用此方法。】
代码如下:
    
        private void button2_Click(object sender, EventArgs e)
        {
           
            List<string> lstIP = new List<string>();
            Ping p1 = new Ping();
            lstIP.Add("192.168.0.1");
            lstIP.Add("192.168.0.2");
            lstIP.Add("192.168.0.3");
            lstIP.Add("192.168.0.4");
            lstIP.Add("192.168.0.5");
            lstIP.Add("192.168.0.6");
            lstIP.Add("192.168.0.7");
            lstIP.Add("192.168.0.8");            //设置PingCompleted事件处理程序    
            p1.PingCompleted += new PingCompletedEventHandler(this.PingCompletedCallBack);
            for (int i = 0; i < lstIP.Count ; i++)
            {
                p1.SendAsync(lstIP[i], i);  
            }
        }
        private void PingCompletedCallBack(object sender, PingCompletedEventArgs e) 
        {
          //do something
        }
因为IP数量很多,总不能一条一条PING,希望能同时PING多个IP地址。不知道,哪位大侠有好办法?

解决方案 »

  1.   

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
    using System.Net.NetworkInformation;namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        private void Form1_Load(object sender, EventArgs e)
            {
                List<string> lstIP = new List<string>();
                Ping p1 = new Ping();
                lstIP.Add("192.168.0.1");
                lstIP.Add("192.168.0.2");
                lstIP.Add("192.168.0.3");
                lstIP.Add("192.168.0.4");
                lstIP.Add("192.168.0.5");
                lstIP.Add("192.168.0.6");
                lstIP.Add("192.168.0.7");
                lstIP.Add("192.168.0.8");
                for (int i = 0; i < lstIP.Count; i++)
                {
                    ThreadPool.QueueUserWorkItem(new WaitCallback(work), lstIP[i]);
                }
            }        void work(object obj)
            {
                string ip = obj as string;
                System.Net.NetworkInformation.Ping p = new System.Net.NetworkInformation.Ping();
                PingReply pr= p.Send(ip);
                Console.WriteLine("{0} ping result :{1}", ip, pr.Status.ToString());
            }
        }
    }