Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Ping类SendAsync帮助_C#_Debugging_Sendasync - Fatal编程技术网

C# Ping类SendAsync帮助

C# Ping类SendAsync帮助,c#,debugging,sendasync,C#,Debugging,Sendasync,我是编程新手,无法找到或不知道要搜索什么来调试用SendAsync方法启动的线程。使用Send方法时代码运行良好,但使用sendsync时,它会转到waiter.WaitOne(),但我从未完成对myPing_Ping的回调(我想它就是这样调用的)。因此,有两个问题是,当代码启动一个新线程时,如何调试代码。我使用的是C#Express,因此它可能没有VS的所有调试工具,也不知道我的代码哪里出错了。 谢谢 我假设您正在myPing_PingCompleted方法中放置一个breakpoinit,但

我是编程新手,无法找到或不知道要搜索什么来调试用SendAsync方法启动的线程。使用Send方法时代码运行良好,但使用sendsync时,它会转到waiter.WaitOne(),但我从未完成对myPing_Ping的回调(我想它就是这样调用的)。因此,有两个问题是,当代码启动一个新线程时,如何调试代码。我使用的是C#Express,因此它可能没有VS的所有调试工具,也不知道我的代码哪里出错了。 谢谢


我假设您正在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;
        }