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

猿猿相抱 2013-07-05 01:19:59
我写了一个测试一组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);
}
}
...全文
772 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
人生导师 2013-07-06
  • 打赏
  • 举报
回复
你加了lock相当于只有一个线程能调用PingSuccess方法了,这样当你不能产生回复的那个线程将会导致PingSuccess这个方法一直锁住状态的,所以你之后的都会产生Timeout结果的,具体你可以研究下SendAsync内部代码看看的
猿猿相抱 2013-07-05
  • 打赏
  • 举报
回复
引用 2 楼 yang1216 的回复:
不会,帮顶一下。 反正你先试试加上waiter吧。
加上执行就和同步差不多了…
yang1216 2013-07-05
  • 打赏
  • 举报
回复
不会,帮顶一下。 反正你先试试加上waiter吧。
猿猿相抱 2013-07-05
  • 打赏
  • 举报
回复
_lock是一个全局变量,忘记粘贴上去了。请各位大侠解惑

110,570

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧