C# Ping已完成的事件处理程序不工作
当我在命令行中执行此代码时,它工作正常:C# Ping已完成的事件处理程序不工作,c#,C#,当我在命令行中执行此代码时,它工作正常: class Program { private static List<Ping> pingers = new List<Ping>(); private static List<string> value = new List<string>(); private static int instances = 0; private static object @lock
class Program
{
private static List<Ping> pingers = new List<Ping>();
private static List<string> value = new List<string>();
private static int instances = 0;
private static object @lock = new object();
private static int result = 0;
private static int timeOut = 2500;
private static int ttl = 7;
public static void Main()
{
string baseIP = "192.168.1.";
Console.WriteLine("Pinging destinations of D-class in {0}*", baseIP);
CreatePingers(254);
PingOptions po = new PingOptions(ttl, true);
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
byte[] data = enc.GetBytes("");
SpinWait wait = new SpinWait();
int cnt =1;
Stopwatch watch = Stopwatch.StartNew();
foreach (Ping p in pingers)
{
lock (@lock)
{
instances += 1;
}
p.SendAsync(string.Concat(baseIP, cnt.ToString()), timeOut, data, po);
cnt += 1;
}
//while (instances > 0)
//{
// wait.SpinOnce();
//}
watch.Stop();
for (int i = 0; i < value.Count; i++)
{
Console.WriteLine(value[i]);
}
DestroyPingers();
Console.WriteLine("Finished in {0}. Found {1} active IP-addresses.", watch.Elapsed.ToString(), result);
Console.ReadKey();
}
public static void Ping_completed(object s, PingCompletedEventArgs e)
{
lock (@lock)
{
instances -= 1;
}
if (e.Reply.Status == IPStatus.Success)
{
string sa = string.Concat("Active IP: ", e.Reply.Address.ToString());
value.Add(sa);
//Console.WriteLine(sa);
String diachiip = e.Reply.Address.ToString();
result += 1;
}
else
{
//Console.WriteLine(String.Concat("Non-active IP: ", e.Reply.Address.ToString()))
}
}
private static void CreatePingers(int cnt)
{
for (int i = 1; i <= cnt; i++)
{
Ping p = new Ping();
p.PingCompleted += Ping_completed;
pingers.Add(p);
}
}
private static void DestroyPingers()
{
foreach (Ping p in pingers)
{
p.PingCompleted -= Ping_completed;
p.Dispose();
}
pingers.Clear();
}
}
类程序
{
私有静态列表pingers=新列表();
私有静态列表值=新列表();
私有静态int实例=0;
私有静态对象@lock=new object();
私有静态int结果=0;
私有静态int超时=2500;
私有静态int ttl=7;
公共静态void Main()
{
字符串baseIP=“192.168.1。”;
WriteLine(“ping{0}*”中D类的目标,baseIP);
创造者(254);
PingOptions po=新的PingOptions(ttl,true);
System.Text.asciencoding enc=新的System.Text.asciencoding();
字节[]数据=enc.GetBytes(“”);
SpinWait wait=新的SpinWait();
int-cnt=1;
秒表=Stopwatch.StartNew();
foreach(pinger中的pingp)
{
锁(@lock)
{
实例+=1;
}
p、 SendAsync(string.Concat(baseIP,cnt.ToString()),超时,数据,po);
cnt+=1;
}
//而(实例>0)
//{
//等等,自旋一次();
//}
看,停;
for(int i=0;i for(int i=1;i方法SendAsync
返回0
,因为您没有等待它完成。您缺少wait
和async
(请参阅):
SpinWait
正在使代码在控制台应用程序中工作。在winforms中,您不应在UI线程中使用SpinWait
(也不应使用Sleep
)。您可以创建另一个线程(例如,通过使用Task
)然后,您可以将代码从控制台应用程序1复制/粘贴到1。但是,每次您想要访问UI控件时,都需要使用Invoke
async
/await
确实更好。如果它能工作(我从方法名得出结论,我不知道该方法做什么,也不知道如何使用它)
也许我错过了一件事,如果SendAsync
返回值,那么您可以通过以下方式获得它(使用async
仍然标记wait
的方法):
尽量说得更具体些。“不工作”-对问题的描述过于宽泛。它是否编译、运行、显示错误?从控制台到windows应用程序的典型问题是试图组织封闭的处理循环。在winforms中,您可以通过使用计时器、BackgroundWorker或其他(而不是UI使用的)线程(Taks、线程)来执行相同的操作.Code在编译时间和运行时没有错误,但变量结果始终返回0。它表示行:“p.SendAsync(string.Concat(baseIP,cnt.ToString()),timeout,data,po)”;“不工作?我无法调试到此行,所以我不知道这会发生什么。请添加一个。谢谢,按照您的帮助,我发现了一些有用的内容:
public partial class Form1 : Form
{
public static List<Ping> pingers = new List<Ping>();
public static List<string> value = new List<string>();
public static int instances = 0;
public static object @lock = new object();
public static int result = 0;
public int timeout = 2500;
public static int ttl = 7;
public Form1()
{
InitializeComponent();
}
public void btnscan_Click(object sender, EventArgs e)
{
string baseIP = "192.168.1.";
//int kt = Int32.Parse(txtkt.Text);
//int start = Int32.Parse(txtstart.Text);
CreatePingers(254);
PingOptions po = new PingOptions(ttl, true);
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
byte[] data = enc.GetBytes("");
int cnt = 1;
Stopwatch watch = Stopwatch.StartNew();
foreach (Ping p in pingers)
{
lock (@lock)
{
instances += 1;
}
p.SendAsync(string.Concat(baseIP, cnt.ToString()), timeout, data, po);
cnt += 1;
}
watch.Stop();
//Result alway return 0
lst1.Items.Add(result.ToString());
lst1.Items.Add(value.Count.ToString());
for (int i = 0; i < value.Count; i++)
{
lst1.Items.Add(value[i]);
lst1.Items.Add("\n");
}
DestroyPingers();
string a = "Finished in " + watch.Elapsed.ToString() + ". Found " + result + " active IP-addresses.";
lst1.Items.Add(a);
}
public static void CreatePingers(int kt)
{
for (int start = 1; start <= kt; start++)
{
// class System.Net.NetworkInformation.Ping
Ping p = new Ping();
p.PingCompleted += Ping_completed();
pingers.Add(p);
}
}
public static PingCompletedEventHandler Ping_completed()
{
PingCompletedEventHandler a = new PingCompletedEventHandler(abc);
return a;
}
static void abc(object s, PingCompletedEventArgs e)
{
value.Add("abc");
lock (@lock)
{
instances -= 1;
}
if (e.Reply.Status == IPStatus.Success)
{
string abcd = string.Concat("Active IP: ", e.Reply.Address.ToString());
value.Add(abcd);
result += 1;
}
}
public static void DestroyPingers()
{
foreach (Ping p in pingers)
{
p.PingCompleted -= Ping_completed();
p.Dispose();
}
pingers.Clear();
}
}
async void btnscan_Click(object sender, EventArgs e)
{
...
await p.SendAsync(string.Concat(baseIP, cnt.ToString()), timeout, data,
...
}
var result = await p.SendAsync(...);