所有线程做同样的工作

时间:2010-08-13 14:53:43

标签: c# multithreading

我想在我的列表视图中写入网络地址,范围为192.168.0.0 -192.168.255.255 我写了一个线程应用程序但是当我运行这个应用程序时,所有线程都试图将地址添加到listview,它有一个简单的解决方案吗?

这是我的代码:

namespace ListNetworkComputers
{
    public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
        }

        const int step = 16777216;
        int threadCount = 1;

        private void frmMain_Load(object sender, EventArgs e)
        {
            ıpAddressControl1.Text = "192.168.0.0";
            ıpAddressControl2.Text = "192.168.255.255";
        }

        private void btnShowPcc_Click(object sender, EventArgs e)
        {

            threadCount = Convert.ToInt32(nudThreads.Value);


            Thread[] threads = new Thread[threadCount];

            for (int i = 0; i < threadCount; i++)
            {
                threads[i] = new Thread(new ThreadStart(getPerformance));
                threads[i].Name = string.Format(i.ToString());
            }

            foreach (Thread t in threads)
            {
                t.Start();
            }
        }

        private void getPerformance()
        {
            uint startIntAdress, endIntAdress;

            startIntAdress = BitConverter.ToUInt32(IPAddress.Parse(ıpAddressControl1.Text).GetAddressBytes(), 0);
            endIntAdress = BitConverter.ToUInt32(IPAddress.Parse(ıpAddressControl2.Text).GetAddressBytes(), 0);

            for (uint i = startIntAdress; i < endIntAdress; i = i + step)
            {
                string ipAddress = new IPAddress(BitConverter.GetBytes(i)).ToString();
                lbNetworkComputers.Items.Add(ipAddress);
            }
        }
    }
}

另一个问题是,我的步法(增加地址为16777216 ......)不健康。它是192.168.0.0到192.168.0.255,但在那之后还没有继续。

2 个答案:

答案 0 :(得分:3)

因为它们相同startIntAdressendIntAdress。为所有线程均匀地分割范围。

应该是这样的:

Thread 1 starts at 192.168.0.0 and checks 32 addresses
Thread 2 at 192.168.0.31 and checks 32,
Thread 3 at 192.168.0.63 and checks 32,
etc

答案 1 :(得分:1)

每个线程运行的代码与传递给每个线程的方法内的IP地址循环完全相同。

您应该将不同的开始和结束地址传递给每个线程。

访问UI的线程也会遇到问题。

从您发布的代码中我不确定这是否真的需要进行线程化。