안녕하세요이는사용
using System;
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.Net;
using System.Threading;
namespace searchIpAdresses
{
public partial class frmSearchIpRange : Form
{
public frmSearchIpRange()
{
InitializeComponent();
}
int intStartIp, intEndIp;
private void frmSearchIpRange_Load(object sender, EventArgs e)
{
startIp.Text = "0.0.0.0";
endIp.Text = "0.1.0.0";
nudThreads.Value = 1;
}
private bool calcIpAddressRange()
{
intStartIp = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(IPAddress.Parse(startIp.Text).GetAddressBytes(), 0));
intEndIp = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(IPAddress.Parse(endIp.Text).GetAddressBytes(), 0));
if (intStartIp>intEndIp)
{
MessageBox.Show("End Ip must be bigger than Begin Ip!");
return false;
}
else
{
return true;
}
}
private void btnShow_Click(object sender, EventArgs e)
{
if (calcIpAddressRange())
{
int 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();
}
//for (int i = 0; i < nudThreads.Value; i++)
//{
// if (threads[i].IsAlive)
// threads[i].Abort();
//}
}
}
private void getPerformance()//int sampleStartIp, int sampleEndIp
{
if (calcIpAddressRange())
{
lbAddress.Items.Clear();
progressBar1.Maximum = intEndIp - intStartIp;
int i;
for (i = intStartIp; i < intEndIp; i++)
{
string ipAddress = new IPAddress(BitConverter.GetBytes(IPAddress.NetworkToHostOrder(i))).ToString();
progressBar1.Value++;
lbAddress.Items.Add(ipAddress);
}
MessageBox.Show(i.ToString() + " addresses added", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
progressBar1.Value = 0;
}
}
}
}
잘 내 멀티 스레드 코드를 작동합니다하지만 난 getPerformance 기능에 작업을 분할 할. 그래서이 경우 Visual Studio에서
threads[i] = new Thread(new ThreadStart(getPerformance(sampleStart, sampleEnd)))
등처럼 사용해야하는 것은 오류가 나에게 "기대 방법 이름"을 제공합니다. 해결 방안은 무엇인가 ?
편집 : 나는이 시도하지만 배열 형식 일 @Henk Holterman
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());
Thread t = new Thread(() => getPerformance(intStartIp, intEndIp));
}
foreach (Thread t in threads)
{
t.Start();
}
플랫폼, 언어로 객체를 전달하는 ParameterizedThreadStart을 사용할 수 있습니다
편집은 루프를 적응? 그것은 C#처럼 보이지만, 언급하는 것은 그다지 작은 노력입니다. –
미안 해요, 깜빡하고 편집했습니다 ... – Rapunzo
getPerformance가 비 -ui 스레드에서 실행되므로 progressBar1 변경 사항이 작동하지 않습니다. 또한 여러 스레드가 속성을 동시에 변경할 수 있으므로 붙여 넣은 코드가 스레드 문제가 발생하기 쉽습니다. – sisve