异步任务中存在大量 ping - 出现异常“异步调用已在进行中”。

2024-03-22

我之前发布了一个关于此问题的问题,我发现了一种使用线程的工作方法 - 但当变量在线程之间重写时,它会导致可靠性问题。我被指出使用 ping 异步和任务,但我收到以下异常:

Error: System.InvalidOperationException: An asynchronous call is already in progress. It must be completed or canceled before you can call this method.

这特别指向“await PingAsync(HostList)”和“await Task.WhenAll(tasks)”

代码如下:

            MySqlConnection Connection = new MySqlConnection(ConnectionString);
            Connection.Open();
            MySqlCommand query = Connection.CreateCommand();
            query.CommandText = "SELECT obj_id AS id,ip FROM objects LIMIT 15";
            MySqlDataReader Nodes = query.ExecuteReader();

            // Record in log that a NEW iteration is starting - for tracking issues with pings
            Library.WriteErrorLog("######################## New Iteration ########################");

            var HostList = new List<HostObject>();

            int i = 1;
            while (Nodes.Read())
            {
                var Host = new HostObject();
                Host.HostName = Nodes["ip"].ToString();
                Host.HostID = Nodes["id"].ToString();
                HostList.Add(Host);
                i++;
            }

            Connection.Close();

            var results = await PingAsync(HostList);
            bool WaitingOnPings = false;
            while (WaitingOnPings == false)
            {
                if (results != null)
                {
                    foreach (PingReply result in results)
                    {
                        Library.WriteErrorLog(result.Status.ToString());
                    }

                    WaitingOnPings = true;
                }
                else
                {
                    Thread.Sleep(500);
                }
            }

and :

private async Task<List<PingReply>> PingAsync(List<HostObject> HostList)
    {
        Ping pingSender = new Ping();
        var tasks = HostList.Select(HostName => pingSender.SendPingAsync(HostName.ToString(), 2000));
        var results = await Task.WhenAll(tasks);

        return results.ToList();
    }

谢谢您的帮助!


Ping可能不打算用于多个并发请求。尝试创建一个新的Ping每个主机的对象。

private async Task<List<PingReply>> PingAsync(List<HostObject> HostList)
{
    var tasks = HostList.Select(HostName => new Ping().SendPingAsync(HostName.ToString(), 2000));
    var results = await Task.WhenAll(tasks);

    return results.ToList();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

异步任务中存在大量 ping - 出现异常“异步调用已在进行中”。 的相关文章

随机推荐