异步任务中执行大量ping操作-获取异常"“异步调用已在进行中."" [英] Large amount of pings in async task - getting Exception "An asynchronous call is already in progress."

查看:169
本文介绍了异步任务中执行大量ping操作-获取异常"“异步调用已在进行中.""的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我发布了有关此问题的先前问题,我发现了一种使用线程的工作方法-但是当在线程之间重写变量时,这会导致可靠性问题.有人指出我要使用ping异步和任务,但出现以下异常:

I posted a previous question about this, I found a sort of working method using threads - but it was causing reliability issues when variables were rewritten between threads. I was pointed towards using ping async and tasks, but I'm getting the following exception:

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

专门指向等待PingAsync(HostList)"和等待Task.WhenAll(任务)"

That points specifically to the "await PingAsync(HostList)" and "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);
                }
            }

和:

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 对象.

Ping was probably not intended to be used for multiple concurrent requests. Try creating a new Ping object for each host.

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();
}

这篇关于异步任务中执行大量ping操作-获取异常&quot;“异步调用已在进行中."&quot;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆