我是编程新手,无法找到或知道要搜索什么来调试使用SendAsync方法启动的线程。使用Send方法可以很好地使用代码,但是当使用SendAsync时,它会转到waiter.WaitOne(),但我从来没有得到myPing_PingCompleted的回调(我认为这就是它所谓的)。所以有两个问题如何在启动新线程时调试代码。我正在使用C#Express,因此它可能没有像VS那样的所有debuging工具。以及我在代码中出错的任何想法。 感谢
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;
}
答案 0 :(得分:0)
我假设您在myPing_PingCompleted方法中设置了一个breakpoinit但是在调试模式下它只是不去那里。是对的吗?
代码是否会引发某种错误?如果您单步执行代码,它是否使用正确的参数调用myPing.SendAsync?
我刚试过你的代码(没有IPQueue,因为它看起来像你的自定义类)。它在我的最终工作正常。我使用了一个有效的IP和不存在的IP。它在两种情况下都很有效。
修改新信息
好吧,我刚刚在Windows窗体应用程序中尝试过它并且它不起作用。当我在单元测试之前尝试它时。基本上,似乎用于呈现窗体和处理事件的线程不能用于创建异步请求(可能因为它是前台线程)。但是,通过创建另一个执行ping的线程,您可以非常轻松地获得它。
实际上,理想情况下,无论如何你都必须这样做。为了使窗体应用程序不会在线程繁忙时锁定,一个好的原则是在单独的线程上完成所有后台工作。这将保持窗体响应。但是要小心,当尝试使用背景线程访问控件时,会抛出异常。最好将所需的所有值读入私有变量,然后将一个线程完成所有工作,让该线程更新另一组变量,然后让forground线程读取变量并更新控件。