0

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

1 回答 1

0

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

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

我刚刚尝试了您的代码(没有 IPQueue,因为它看起来像您的自定义类)。它在我这边工作得很好。我使用了一个有效的 IP 和一个不存在的 IP。它在两种情况下都运作良好。

编辑以获取新信息

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

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

于 2009-09-16T20:37:42.960 回答