当前位置:编程学习 > C#/ASP.NET >>

关于C#中Ping.SendAsync和异步的问题

我写了一个测试一组ip地址ping值得程序,然后使用sendaysnc方法,但是现在问题是如果其中有一条记录出现timeout的话,下面所有的都会出现timeout(比如说到第100条,ip地址没法ping通,那么之后的31条记录都会返回timeout的结果)。请教各位大侠这是什么情况。

在MSDN查看实例中,里面有用到waiter,说是来保证每次执行sendaysnc都能得到答复。但是我不理解的是什么原因造成的上述情况,为什么在timeout之前的记录都能答复成功?而如果其中有一个阻塞了剩下的都不行,是什么原理。阻塞后程序内部究竟发生了什么?请教


//cdn1.txt中有131条ip记录
//ip记录格式192.168.1.1 www.baidu.com
private static void Main()
        {
            var sr = new StreamReader("cdn1.txt");
            while (true)
            {
                string str = sr.ReadLine();
                if (String.IsNullOrEmpty(str))
                    break;
                    PingFunc(str);
            }
            sr.Close();
            Console.ReadLine();
        }



private static void PingFunc(string str)
        {
            testping = new Ping();
            string ip = str.Split(' ')[0];
            testping.PingCompleted += PingSuccess;
            testping.SendAsync(ip, 1000, str);
}



static void PingSuccess(object sender, PingCompletedEventArgs e)
        {
            lock (_lock)
            {
                        string temp = e.UserState + "请求结果:" + e.Reply.Status + "(编号" + i + "),耗时:" + e.Reply.RoundtripTime + "ms";
                        result.AppendLine(temp);
                        StreamWriter sw = new StreamWriter("result.txt", true);
                        sw.WriteLine(temp);
                        sw.Close();
                        Console.WriteLine(temp);
            }
        }
--------------------编程问答-------------------- _lock是一个全局变量,忘记粘贴上去了。请各位大侠解惑 --------------------编程问答-------------------- 不会,帮顶一下。
反正你先试试加上waiter吧。 --------------------编程问答--------------------
引用 2 楼 yang1216 的回复:
不会,帮顶一下。
反正你先试试加上waiter吧。
加上执行就和同步差不多了… --------------------编程问答-------------------- 你加了lock相当于只有一个线程能调用PingSuccess方法了,这样当你不能产生回复的那个线程将会导致PingSuccess这个方法一直锁住状态的,所以你之后的都会产生Timeout结果的,具体你可以研究下SendAsync内部代码看看的 
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,