【问题标题】:Ping.SendAsync return empty list request when input prepared from database当从数据库准备输入时,Ping.SendAsync 返回空列表请求
【发布时间】:2021-10-16 20:02:12
【问题描述】:

我找到了一个代码来检查从列表中读取地址并以异步方式 ping 它们并处理结果的多个主机的连接性。

当我使用预定义列表时,例如:

public static List<string> addresses = new List<string> { "172.20.74.1", "192.168.1.103", "192.168.1.104", "192.168.1.105"};

一切正常,但是当我从数据库中读取此列表时,会发生 NullReferenceException。有人可以帮我解决这个问题吗?

using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.NetworkInformation;
using System.Data.SqlClient;
using System.Collections.Generic;
using System;

namespace asyncPing
{
    class Program
    {
        public static List<string> addresses = getNetAddress();
        //public static List<string> addresses = new List<string> { "172.20.74.1", "192.168.1.103", "192.168.1.104", "192.168.1.105"};
        static void Main(string[] args)
        {
            List<Task<PingReply>> pingTasks = new List<Task<PingReply>>();

            foreach (var address in addresses)
            {
                Console.WriteLine(address);

            }
            foreach (var address in addresses)
            {
                pingTasks.Add(PingAsync(address));
            }

            //Wait for all the tasks to complete
            Task.WaitAll(pingTasks.ToArray());

            //Now you can iterate over your list of pingTasks
            foreach (var pingTask in pingTasks)
            {

                Console.WriteLine(pingTask.Result.Address + "\t" + pingTask.Result.Status);
                if (pingTask.Result.Status != IPStatus.Success)
                {
                    //Do Some Thing
                }
            }
            Console.ReadLine();
        }

        public static List<string> getNetAddress()
        {
            List<string> addr = new List<string>();
            string connetionString = @"Data Source=localhost;Initial Catalog=AlarmsDB;Persist Security Info=True;User ID=sa;Password=123456";



            using (SqlConnection myConnection = new SqlConnection(connetionString))
            {
                //Console.WriteLine("Connection Open  !");
                string oString = "Select ip_address from Networks";
                SqlCommand oCmd = new SqlCommand(oString, myConnection);

                myConnection.Open();
                using (SqlDataReader oReader = oCmd.ExecuteReader())
                {
                    while (oReader.Read())
                    {
                        addr.Add(oReader["ip_address"].ToString());
                    }

                    myConnection.Close();
                }
            }

            return addr;
        }
        static Task<PingReply> PingAsync(string address)
        {
            var tcs = new TaskCompletionSource<PingReply>();
            Ping ping = new Ping();
            ping.PingCompleted += (obj, sender) =>
            {
                tcs.SetResult(sender.Reply);
            };
            ping.SendAsync(address, new object());
            return tcs.Task;
        }
    }
}

异常发生在一行:

Console.WriteLine(pingTask.Result.Address + "\t" + pingTask.Result.Status);

async pings 方法的结果似乎为空。 我不知道为什么当从数据库传递相同的输入时,输出的结果会发生变化?

【问题讨论】:

  • 一个推荐,请使用WhenAll代替WaitAll
  • ping.SendAsync(address, new object()); 更改为 await ping.SendAsync(address, new object()); - 这能解决问题吗?
  • 你能不能试着把pingTasks.Add(PingAsync(address));换成pingTasks.Add(new Ping().SendPingAsync(address));,看看有什么不同?

标签: c# asynchronous ping


【解决方案1】:

感谢大家提出的解决问题的建议

2天后我终于找到了问题根源

在将 IP 地址传递给 asyncPing 方法之前,我修剪了 IP 地址后,问题解决了。

我将ip地址作为字符串保存在数据库中但不知道为什么我阅读后必须修剪它们

我能够通过更改以下行来解决问题:

using (SqlDataReader oReader = oCmd.ExecuteReader())
                {
                    while (oReader.Read())
                    {                        
                 addr.Add(oReader["ip_address"].ToString().Trim());
                    }

                    myConnection.Close();
                }

【讨论】:

  • 可能数据库列的类型是 char 而不是 varchar
  • 列类型为 nchar(20)。是不是觉得存储ip地址的数据类型不对?
  • 来自here: nchar - 在数据中添加尾随空格。 nvarchar - 不向数据添加尾随空格。 用于存储 IP 地址的最有效数据类型可能是 varbinary(16),如 here 所述。
  • Theodor Zoulias,感谢您的指导和建议。在您的指导下,我学到了一些新东西
猜你喜欢
  • 2013-02-27
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-07
  • 1970-01-01
  • 2018-12-29
  • 2022-01-04
相关资源
最近更新 更多