我找到了一個代碼來檢查多個主機的連接性,這些主機從串列中讀取地址并以異步方式 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 方法的結果似乎為空。我不知道為什么當從資料庫傳遞相同的輸入時,輸出的結果會發生變化?

uj5u.com熱心網友回復:
感謝所有家伙為解決問題提出的建議
最后我在 2 天后找到了問題根源
在將 ip 地址傳遞給 asyncPing 方法之前修剪了它之后,問題解決了。
我在資料庫中保存了ip地址為字串但不知道為什么我讀完后要修剪它們
我能夠通過更改以下行來解決問題:
using (SqlDataReader oReader = oCmd.ExecuteReader())
{
while (oReader.Read())
{
addr.Add(oReader["ip_address"].ToString().Trim());
}
myConnection.Close();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/323494.html
