C# SendAsync不会每次都回复所有请求

C# SendAsync不会每次都回复所有请求,c#,multithreading,thread-safety,C#,Multithreading,Thread Safety,从下面的代码来看,有时它不会回复所有的ping请求,并且会等待无限长的时间。是否存在死锁问题?如果是,如何处理?如何在没有死锁的情况下为每个ip获得正确的结果 class Program { static Semaphore PingSender { get; set; } static object lockObj = new object(); static void Main(string[] args)

从下面的代码来看,有时它不会回复所有的ping请求,并且会等待无限长的时间。是否存在死锁问题?如果是,如何处理?如何在没有死锁的情况下为每个ip获得正确的结果

class Program
    {        
        static Semaphore PingSender { get; set; }
        static object lockObj = new object();
        static void Main(string[] args)
        {
            long pingSent = 0;
            long pingReceived = 0;
            PingSender = new Semaphore(10000, 10000);

            for (int dotNoDot = 1; dotNoDot <= 255; dotNoDot++)
            {
                for (int dotNo = 1; dotNo <= 255; dotNo++)
                {
                    try
                    {
                        string ipAddress = string.Format("111.222.{0}.{1}", dotNoDot, dotNo);       //Please change necessary ip base
                        PingSender.WaitOne();
                        Ping ping = new Ping();
                        ping.PingCompleted += (sender, eventArgs) =>
                        {
                            //lock (lockObj)
                            //{
                                PingSender.Release(1);
                                Console.WriteLine(string.Format("{0}) Address: {1} and Status: {2}", pingReceived, eventArgs.UserState, eventArgs.Reply.Status));
                                if (eventArgs.Reply.Status == IPStatus.Success)
                                {
                                    //collect online machines
                                }
                                Interlocked.Increment(ref pingReceived);
                                if (pingReceived == pingSent)
                                {
                                    //done
                                }
                            //}
                        };
                        //lock (lockObj)
                        //{
                            pingSent++;
                       // }
                        ping.SendAsync(ipAddress, 10000, ipAddress);                       

                    }
                    catch (Exception ex)
                    {

                    }

                }
            }           
        }
}
类程序
{        
静态信号量PingSender{get;set;}
静态对象lockObj=新对象();
静态void Main(字符串[]参数)
{
long-pingSent=0;
长时间=0;
PingSender=新信号量(10000,10000);

对于(int dotNoDot=1;dotNoDot为什么要同时使用两个不同的锁定前置词?(
信号量
锁定
)?Yuval,我对一些代码进行了注释。请检查