我想在我的列表视图中写入网络地址,范围为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,但在那之后还没有继续。
答案 0 :(得分:3)
因为它们相同startIntAdress
和endIntAdress
。为所有线程均匀地分割范围。
应该是这样的:
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的线程也会遇到问题。
从您发布的代码中我不确定这是否真的需要进行线程化。