我正在编写一个C#
Ping应用程序。我从synchronous
Ping方法开始,但是我发现一次单击即可ping通多台服务器会花费越来越多的时间。因此,我决定尝试该asynchronous
方法。
有人可以帮我吗?
public async Task<string> CustomPing(string ip, int amountOfPackets, int sizeOfPackets)
{
// timeout
int Timeout = 2000;
// PaketSize logic
string packet = "";
for (int j = 0; j < sizeOfPackets; j++)
{
packet += "b";
};
byte[] buffer = Encoding.ASCII.GetBytes(packet);
// time-var
long ms = 0;
// Main Method
using (Ping ping = new Ping())
for (int i = 0; i < amountOfPackets; i++)
{
PingReply reply = await ping.SendPingAsync(ip, Timeout, buffer);
ms += reply.RoundtripTime;
};
return (ms / amountOfPackets + " ms");
};
我定义了“服务器”类(Ip或主机,城市,国家/地区)。
然后创建一个“服务器”列表:
List<Server> ServerList = new List<Server>()
{
new Server("www.google.de", "Some City,", "Some Country")
};
然后,我遍历此列表,并尝试调用如下方法:
foreach (var server in ServerList)
ListBox.Items.Add("The average response time of your custom server is: " + server.CustomPing(server.IP, amountOfPackets, sizeOfPackets));
不幸的是,这比synchronous
方法更具竞争力,并且在我的方法应返回值的时候,它返回
System.Threading.Tasks.Taks`1 [System.string]
由于您有一个异步方法,因此调用该方法时将返回任务:
Task<string> task = server.CustomPing(server.IP, amountOfPackets, sizeOfPackets);
当您将其直接ListBox
与字符串连接时,将使用该ToString
方法,默认情况下,该方法会打印该对象的完整类名。这应该解释您的输出:
System.Threading.Tasks.Taks`1 [System.string]
该[System.string]
部分实际上告诉您任务结果的返回类型。这就是您想要的,要获得它,您需要等待它!像这样:
foreach (var server in ServerList)
ListBox.Items.Add("The average response time of your custom server is: " + await server.CustomPing(server.IP, amountOfPackets, sizeOfPackets));
1)这必须用另一种async
方法完成
2)这会搞乱您想要的所有并行性。因为它将等待每个方法调用完成。
您可以做的是依次启动所有任务,收集返回的任务,然后等待所有任务完成。最好使用异步方法(例如clickhandler)来执行此操作:
private async void Button1_Click(object sender, EventArgs e)
{
Task<string> [] allTasks = ServerList.Select(server => server.CustomPing(server.IP, amountOfPackets, sizeOfPackets)).ToArray();
// WhenAll will wait for all tasks to finish and return the return values of each method call
string [] results = await Task.WhenAll(allTasks);
// now you can execute your loop and display the results:
foreach (var result in results)
{
ListBox.Items.Add(result);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句