我的代码(SendPingAsync)有什么问题

用户名

我正在编写一个C#Ping应用程序。我从synchronousPing方法开始,但是我发现一次单击即可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]

Mong Zhu

由于您有一个异步方法,因此调用该方法时将返回任务:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章