我正在尝试从.csv文件中读取ip地址,并使用PingAsync类对这些地址进行ping。但我在下面一行中超越了异常。
await Task.WhenAll(pingTasks);下面是我的完整代码,请看一看。
平法
private static async Task AsyncPingTask(List<string> ipaddress)
{
try
{
Console.WriteLine("Ping Started");
StringBuilder pingStringBuilder = new StringBuilder();
var pingTasks = ipaddress.Select(ip =>
{
using (var ping = new Ping())
{
return ping.SendPingAsync(ip);
}
}).ToList();
Console.WriteLine("Ping Completed");
await Task.WhenAll(pingTasks);
foreach (var pingReply in pingTasks)
{
pingStringBuilder.Append(pingReply.Result.Address);
pingStringBuilder.Append("-->");
pingStringBuilder.Append(pingReply.Result.Status);
pingStringBuilder.Append("-->");
pingStringBuilder.Append(pingReply.Result.RoundtripTime.ToString());
pingStringBuilder.AppendLine();
}
Console.WriteLine(pingStringBuilder.ToString());
pingStringBuilder.Clear();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message.ToString());
throw;
}
}主要方法:
public static void Main()
{
List<string> address = new List<string>();
Task t = Task.Run(() =>
{
var reader = new StreamReader(File.OpenRead(Environment.CurrentDirectory+@"\address.csv"));
while (!reader.EndOfStream)
{
var lines = reader.ReadLine();
var values = lines.Split(';');
address.Add(values[0]);
}
});
Console.WriteLine("List COunt is {0}",address.Count);
Stopwatch timeSpan=Stopwatch.StartNew();
t.Wait();
AsyncPingTask(address).Wait();
Console.WriteLine(timeSpan.ElapsedMilliseconds);
Console.ReadLine();
}如果我做错了什么,请指导我。
发布于 2015-08-13 06:49:43
这段代码就是问题所在:
var pingTasks = ipaddress.Select(ip =>
{
using (var ping = new Ping())
{
return ping.SendPingAsync(ip);
}
}).ToList();在Ping操作有机会完成之前,您正在处理async类,因为您不是在等待SendPingAsync,而是简单地返回它生成的热任务。这导致在操作完成之前进行处置。
将代码更改为:
var pingTasks = ipaddress.Select(ip =>
{
var ping = new Ping();
return ping.SendPingAsync(ip);
}).ToList();https://stackoverflow.com/questions/31981044
复制相似问题