我是编程新手,找不到也不知道要搜索什么来调试用SendAsync方法启动的线程。使用Send方法可以很好地运行代码,但是当使用SendAsync时,它会转到waiter.WaitOne(),但我从来没有得到myPing_PingCompleted的回调(我想它就是这样调用的)。所以有两个问题,当代码启动一个新线程时,我该如何调试它。我使用的是C# Express,所以它可能并不像VS那样拥有所有的调试工具。以及我在代码中哪里出了问题。谢谢
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;
}发布于 2009-09-16 20:37:43
我假设你在myPing_PingCompleted方法中设置了一个断点,但是在调试模式下,断点就不在那里了。是那么回事吗?
代码是否抛出了某种错误?如果单步执行代码,它是否使用正确的参数调用myPing.SendAsync?
我刚刚测试了您的代码(没有IPQueue,因为它看起来像您的自定义类)。它在我这一端工作得很好。我使用了一个有效的IP和不存在的IP。它在这两种情况下都工作得很好。
用于新信息的编辑
好的,我刚刚在一个windows窗体应用程序中尝试了一下,它不工作。当我在单元测试之前尝试它的时候。基本上,用于呈现windows窗体和处理事件的线程似乎不能用于创建异步请求(可能是因为它是前台线程)。但是,通过创建另一个线程来执行ping操作,您可以很容易地绕过它。
实际上,理想情况下,无论如何这都是你必须要做的。为了使windows窗体应用程序在线程繁忙时不会被锁定,一个好的原则是在单独的线程上完成所有后台工作。这将使windows窗体保持响应性。但是要小心,当尝试使用后台线程访问控件时,会抛出异常。最好是将所有你想要的值读取到私有变量中,然后启动一个线程来完成所有的工作,让这个线程更新另一组变量,然后让forground线程读取变量并更新控件。
https://stackoverflow.com/questions/1434342
复制相似问题