C# Ping已完成的事件处理程序不工作

C# Ping已完成的事件处理程序不工作,c#,C#,当我在命令行中执行此代码时,它工作正常: class Program { private static List<Ping> pingers = new List<Ping>(); private static List<string> value = new List<string>(); private static int instances = 0; private static object @lock

当我在命令行中执行此代码时,它工作正常:

class Program
{

    private static List<Ping> pingers = new List<Ping>();
    private static List<string> value = new List<string>();
    private static int instances = 0;
    private static object @lock = new object();
    private static int result = 0;
    private static int timeOut = 2500;
    private static int ttl = 7;
    public static void Main()
    {
        string baseIP = "192.168.1.";

        Console.WriteLine("Pinging  destinations of D-class in {0}*", baseIP);

        CreatePingers(254);


        PingOptions po = new PingOptions(ttl, true);
        System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
        byte[] data = enc.GetBytes("");

        SpinWait wait = new SpinWait();
        int cnt =1;

        Stopwatch watch = Stopwatch.StartNew();

        foreach (Ping p in pingers)
        {
            lock (@lock)
            {
                instances += 1;
            }

            p.SendAsync(string.Concat(baseIP, cnt.ToString()), timeOut, data, po);
            cnt += 1;
        }

        //while (instances > 0)
        //{
        //    wait.SpinOnce();
        //}

        watch.Stop();
        for (int i = 0; i < value.Count; i++)
        {
            Console.WriteLine(value[i]);
        }
        DestroyPingers();

        Console.WriteLine("Finished in {0}. Found {1} active IP-addresses.", watch.Elapsed.ToString(), result);
        Console.ReadKey();

    }

    public static void Ping_completed(object s, PingCompletedEventArgs e)
    {
        lock (@lock)
        {
            instances -= 1;
        }

        if (e.Reply.Status == IPStatus.Success)
        {

           string sa = string.Concat("Active IP: ", e.Reply.Address.ToString());
           value.Add(sa);
          //Console.WriteLine(sa);
            String diachiip = e.Reply.Address.ToString();
            result += 1;

        }
        else
        {
            //Console.WriteLine(String.Concat("Non-active IP: ", e.Reply.Address.ToString()))
        }
    }


    private static void CreatePingers(int cnt)
    {
        for (int i = 1; i <= cnt; i++)
        {
            Ping p = new Ping();
            p.PingCompleted += Ping_completed;
            pingers.Add(p);
        }
    }

    private static void DestroyPingers()
    {
        foreach (Ping p in pingers)
        {
            p.PingCompleted -= Ping_completed;
            p.Dispose();
        }

        pingers.Clear();

    }
}
类程序
{
私有静态列表pingers=新列表();
私有静态列表值=新列表();
私有静态int实例=0;
私有静态对象@lock=new object();
私有静态int结果=0;
私有静态int超时=2500;
私有静态int ttl=7;
公共静态void Main()
{
字符串baseIP=“192.168.1。”;
WriteLine(“ping{0}*”中D类的目标,baseIP);
创造者(254);
PingOptions po=新的PingOptions(ttl,true);
System.Text.asciencoding enc=新的System.Text.asciencoding();
字节[]数据=enc.GetBytes(“”);
SpinWait wait=新的SpinWait();
int-cnt=1;
秒表=Stopwatch.StartNew();
foreach(pinger中的pingp)
{
锁(@lock)
{
实例+=1;
}
p、 SendAsync(string.Concat(baseIP,cnt.ToString()),超时,数据,po);
cnt+=1;
}
//而(实例>0)
//{
//等等,自旋一次();
//}
看,停;
for(int i=0;ifor(int i=1;i方法
SendAsync
返回
0
,因为您没有等待它完成。您缺少
wait
async
(请参阅):

SpinWait
正在使代码在控制台应用程序中工作。在winforms中,您不应在UI线程中使用
SpinWait
(也不应使用
Sleep
)。您可以创建另一个线程(例如,通过使用
Task
)然后,您可以将代码从控制台应用程序1复制/粘贴到1。但是,每次您想要访问UI控件时,都需要使用
Invoke

async
/
await
确实更好。如果它能工作(我从方法名得出结论,我不知道该方法做什么,也不知道如何使用它)

也许我错过了一件事,如果
SendAsync
返回值,那么您可以通过以下方式获得它(使用
async
仍然标记
wait
的方法):


尽量说得更具体些。“不工作”-对问题的描述过于宽泛。它是否编译、运行、显示错误?从控制台到windows应用程序的典型问题是试图组织封闭的处理循环。在winforms中,您可以通过使用计时器、BackgroundWorker或其他(而不是UI使用的)线程(Taks、线程)来执行相同的操作.Code在编译时间和运行时没有错误,但变量结果始终返回0。它表示行:“p.SendAsync(string.Concat(baseIP,cnt.ToString()),timeout,data,po)”;“不工作?我无法调试到此行,所以我不知道这会发生什么。请添加一个。谢谢,按照您的帮助,我发现了一些有用的内容:
public partial class Form1 : Form
{

    public static List<Ping> pingers = new List<Ping>();
    public static List<string> value = new List<string>();
    public static int instances = 0;
    public static object @lock = new object();
    public static int result = 0;
    public int timeout = 2500;
    public static int ttl = 7;
    public Form1()
    {
        InitializeComponent();
    }

    public void btnscan_Click(object sender, EventArgs e)
    {
        string baseIP = "192.168.1.";
        //int kt = Int32.Parse(txtkt.Text);
        //int start = Int32.Parse(txtstart.Text);
        CreatePingers(254);
        PingOptions po = new PingOptions(ttl, true);
        System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
        byte[] data = enc.GetBytes("");
        int cnt = 1;
        Stopwatch watch = Stopwatch.StartNew();
        foreach (Ping p in pingers)
        {
            lock (@lock)
            {
                instances += 1;

            }
            p.SendAsync(string.Concat(baseIP, cnt.ToString()), timeout, data, po);
            cnt += 1;        
        }
        watch.Stop();
        //Result alway return 0
        lst1.Items.Add(result.ToString());
        lst1.Items.Add(value.Count.ToString());
        for (int i = 0; i < value.Count; i++)
        {
            lst1.Items.Add(value[i]);
            lst1.Items.Add("\n");
        }
        DestroyPingers();
        string a = "Finished in " + watch.Elapsed.ToString() + ". Found " + result + " active IP-addresses.";
        lst1.Items.Add(a);
    }


    public static void CreatePingers(int kt)
    {
        for (int start = 1; start <= kt; start++)
        {
            // class System.Net.NetworkInformation.Ping
            Ping p = new Ping();
            p.PingCompleted += Ping_completed();
            pingers.Add(p);
        }
    }

     public static PingCompletedEventHandler Ping_completed()
    {
         PingCompletedEventHandler a = new PingCompletedEventHandler(abc);
         return a;
    }

    static void abc(object s, PingCompletedEventArgs e)
     {
         value.Add("abc");
         lock (@lock)
         {
             instances -= 1;
         }
         if (e.Reply.Status == IPStatus.Success)
         {
             string abcd = string.Concat("Active IP: ", e.Reply.Address.ToString());
             value.Add(abcd);
             result += 1;
         }
     }
     public static void DestroyPingers()
     {
         foreach (Ping p in pingers)
         {
             p.PingCompleted -= Ping_completed();
             p.Dispose();
         }
         pingers.Clear();
     }
}
async void btnscan_Click(object sender, EventArgs e)
{
    ...
    await p.SendAsync(string.Concat(baseIP, cnt.ToString()), timeout, data, 
    ...
}
var result = await p.SendAsync(...);