C# Ping类SendAsync帮助
我是编程新手,无法找到或不知道要搜索什么来调试用SendAsync方法启动的线程。使用Send方法时代码运行良好,但使用sendsync时,它会转到waiter.WaitOne(),但我从未完成对myPing_Ping的回调(我想它就是这样调用的)。因此,有两个问题是,当代码启动一个新线程时,如何调试代码。我使用的是C#Express,因此它可能没有VS的所有调试工具,也不知道我的代码哪里出错了。 谢谢C# Ping类SendAsync帮助,c#,debugging,sendasync,C#,Debugging,Sendasync,我是编程新手,无法找到或不知道要搜索什么来调试用SendAsync方法启动的线程。使用Send方法时代码运行良好,但使用sendsync时,它会转到waiter.WaitOne(),但我从未完成对myPing_Ping的回调(我想它就是这样调用的)。因此,有两个问题是,当代码启动一个新线程时,如何调试代码。我使用的是C#Express,因此它可能没有VS的所有调试工具,也不知道我的代码哪里出错了。 谢谢 我假设您正在myPing_PingCompleted方法中放置一个breakpoinit,但
我假设您正在myPing_PingCompleted方法中放置一个breakpoinit,但在调试模式下,它不会出现。是这样吗 代码是否抛出了某种错误?如果您单步执行代码,它是否使用正确的参数调用myPing.SendAsync 我刚刚尝试了您的代码(没有IPQueue,因为它看起来像您的自定义类)。对我来说效果很好。我使用了一个有效的IP和不存在的IP。在这两种情况下效果都很好 编辑新信息 好的,我只是在windows窗体应用程序中尝试了它,但它不起作用。当我在单元测试之前尝试它时。基本上,用于呈现windows窗体和处理事件的线程似乎不能用于创建异步请求(可能是因为它是一个前台线程)。但是,通过创建另一个线程来执行ping,您可以很容易地绕过它
事实上,理想情况下,无论如何你都必须这样做。为了使windows窗体应用程序在线程繁忙时不被锁定,一个好的原则是在一个单独的线程上执行所有回溯工作。这将使windows窗体保持响应。不过要小心,当尝试使用反向线程访问控件时,将引发异常。最好将所有需要的值读入私有变量,然后启动一个线程来完成所有工作,让该线程更新另一组变量,然后让前面的线程读取变量并更新控件。奇怪的是,我从联机帮助中复制了同样失败的示例。。Ping类的msdn在线帮助是我用作指南的。是的,我在myPing_Ping Completed方法的第一条语句中有一个断点。当单步执行程序时,要执行的最后一条语句是waiter.WaitOne()方法,表单将返回,但没有完全重新绘制,然后什么也没有。这是在两台不同的计算机上发生的。我会错过一个参考吗?我已经在问题中的代码示例中添加了我所拥有的引用,并且我试着用一个IP地址代替IPQueue,同样的事情仍然发生。
using System;
using System.CodeDom;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Net.NetworkInformation;
using System.Threading;
using System.Net;
private void btnPingAsync_Click(object sender, EventArgs e)
{
string bIP = txtStartIP.Text;
string eIP = txtEndIP.Text;
int timeOut;
int cnt = 0;
if (eIP == null) eIP = bIP;
Ping myPing = new Ping();
PingOptions parmPing = new PingOptions();
AutoResetEvent waiter = new AutoResetEvent(false);
myPing.PingCompleted +=new PingCompletedEventHandler(myPing_PingCompleted);
string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
byte[] dataBuffer = Encoding.ASCII.GetBytes(data);
if (!int.TryParse(txtTimeOut.Text, out timeOut)) timeOut = 120;
parmPing.DontFragment = true;
parmPing.Ttl = 32;
pbQueueStatus.Minimum = 0;
pbQueueStatus.Step = 10;
pbQueueStatus.Value = 0;
pbQueueStatus.Style = ProgressBarStyle.Continuous;
if (verify.ValidIPAddress(bIP) && verify.ValidIPAddress(eIP))
{
IPQueue = build.IPAddressQueue(bIP, eIP);
pbQueueStatus.Maximum = IPQueue.Count;
pbQueueStatus.TopLevelControl.UseWaitCursor= true;
pbQueueStatus.Visible = true;
while (IPQueue.Count > 0)
{
myPing.SendAsync(IPQueue.Dequeue(), timeOut, dataBuffer, parmPing, waiter);
waiter.WaitOne();
if (++cnt > 10)
{
pbQueueStatus.PerformStep();
cnt = 0;
}
}
}
}
private void myPing_PingCompleted(Object sender, PingCompletedEventArgs e)
{
PingReply reply = e.Reply;
((AutoResetEvent)e.UserState).Set();
if (reply .Status == IPStatus .Success )
{
dosomething;
}