线程进行Ping测试时,主表单卡住了

时间:2014-12-18 09:17:51

标签: c# multithreading

我正在制作基于多线程的ping测试程序。

因此,我向ListView控件添加了几个IP,并为每个项目制作了一个BackgroundWorkers。 毕竟,我开始编程,当我开始ping时,主窗体的窗体控件被卡住,直到所有ping结束(包括时间过期的ping)才响应。这是完整的来源。 (我使用Form Designer GUI设计了表单)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Net.NetworkInformation;

namespace Multi_Ping_Tester
{
    public partial class frmMain : Form
    {
        //List<Thread> pingThreads = new List<Thread>();

       private void doPing(object sender, DoWorkEventArgs e)
        {
            Ping pingsender = new Ping();
            PingReply pingres;
            int idx = (int)e.Argument;

            this.Invoke(new MethodInvoker(delegate()
            {
                string addr = lvwIPList.Items[idx].Text;

                //do
                //{
                pingres = pingsender.Send(addr);

                if (pingres.Status == IPStatus.Success)
                {
                    lvwIPList.Items[idx].SubItems[1].Text = pingres.RoundtripTime.ToString();
                    lvwIPList.Items[idx].BackColor = Color.LightGreen;
                }
                else
                {
                    lvwIPList.Items[idx].SubItems[1].Text = "Nein";
                    lvwIPList.Items[idx].BackColor = Color.LightPink;
                }
                //} while(true);
            }));
        }


        List<BackgroundWorker> bgwList = new List<BackgroundWorker>();

        private void ResizeCol()
        {
            chdIP.Width = (int)((lvwIPList.Width - 6) * 0.8);
            chdRTT.Width = (int)((lvwIPList.Width - 6) * 0.2);
        }
        public frmMain()
        {
            InitializeComponent();
        }

        private void frmMain_Load(object sender, EventArgs e)
        {
            ResizeCol();
        }

        private void btnAdd_Click(object sender, EventArgs e)
        {
            lvwIPList.Items.Add(txtIP.Text);
            lvwIPList.FindItemWithText(txtIP.Text).SubItems.Add("");
        }

        private void btnPing_Click(object sender, EventArgs e)
        {
 /*           pingThreads.Clear();
            int idx=0;
*/
            bgwList.Clear();
            int idx = 0;

            foreach (ListViewItem i in lvwIPList.Items)
            {
                /*
                pingThreads.Add(new Thread(new ParameterizedThreadStart(doPing)));
                pingThreads[idx].IsBackground = true;
                pingThreads[idx].Start(idx);
                idx++;
                */
                bgwList.Add(new BackgroundWorker());
                bgwList[idx].DoWork += new DoWorkEventHandler(doPing);
                bgwList[idx].RunWorkerAsync(idx);
                idx++;
            }

        }
    }
}

一些注释行正在使用Threads,但它会产生相同的结果。 可能有什么问题?

1 个答案:

答案 0 :(得分:0)

因为您正在调用ping.Send内的this.InvokeInvoke将在UI线程中同步执行委托,从而冻结用户界面。

您应该在this.Invoke之外进行,或使用await Ping.SendAsync。当然,如果您打算等待,则需要使用async方法进行操作。在您的情况下,您需要一个async lambda。