Ping类SendAsync帮助

时间:2009-09-16 17:20:06

标签: c# debugging sendasync

我是编程新手,无法找到或知道要搜索什么来调试使用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;
        }

1 个答案:

答案 0 :(得分:0)

我假设您在myPing_PingCompleted方法中设置了一个breakpoinit但是在调试模式下它只是不去那里。是对的吗?

代码是否会引发某种错误?如果您单步执行代码,它是否使用正确的参数调用myPing.SendAsync?

我刚试过你的代码(没有IPQueue,因为它看起来像你的自定义类)。它在我的最终工作正常。我使用了一个有效的IP和不存在的IP。它在两种情况下都很有效。

修改新信息

好吧,我刚刚在Windows窗体应用程序中尝试过它并且它不起作用。当我在单元测试之前尝试它时。基本上,似乎用于呈现窗体和处理事件的线程不能用于创建异步请求(可能因为它是前台线程)。但是,通过创建另一个执行ping的线程,您可以非常轻松地获得它。

实际上,理想情况下,无论如何你都必须这样做。为了使窗体应用程序不会在线程繁忙时锁定,一个好的原则是在单独的线程上完成所有后台工作。这将保持窗体响应。但是要小心,当尝试使用背景线程访问控件时,会抛出异常。最好将所需的所有值读入私有变量,然后将一个线程完成所有工作,让该线程更新另一组变量,然后让forground线程读取变量并更新控件。