사용

2010-08-15 5 views
0

안녕하세요이는사용

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(); 
       } 
+0

플랫폼, 언어로 객체를 전달하는 ParameterizedThreadStart을 사용할 수 있습니다


편집은 루프를 적응? 그것은 C#처럼 보이지만, 언급하는 것은 그다지 작은 노력입니다. –

+0

미안 해요, 깜빡하고 편집했습니다 ... – Rapunzo

+0

getPerformance가 비 -ui 스레드에서 실행되므로 progressBar1 변경 사항이 작동하지 않습니다. 또한 여러 스레드가 속성을 동시에 변경할 수 있으므로 붙여 넣은 코드가 스레드 문제가 발생하기 쉽습니다. – sisve

답변

3

1) 당신은 아마 스레드 풀 또는 작업 (FX4를 사용한다)에 적용 couldnt한다.

2) 시작과 끝 개최 대표 나중에 lamba'a (.NET 3)

int a=1, b=2; 
    Thread t = new Thread(() => Worker(a, b)); 
당신이 ParameterizedThreadStart 사용할 수있는 이전 버전의 경우

과 도우미 개체를 사용할 수 있습니다.

for (int i = 0; i < threadCount; i++) 
{ 
    // some code to update intStartIp, intEndIp 

    //threads[i] = new Thread(new ThreadStart(getPerformance));     
    threads[i] = new Thread(() => getPerformance(intStartIp, intEndIp)); 
    threads[i].Name = string.Format(i.ToString()); 
} 
+0

이것을 다중 스레드에 사용할 수 있습니까? 이 "t"변수가 배열 유형이 아니기 때문에 – Rapunzo

+0

예, 이것을 코드에 적용 할 수 있습니다. 't'는 Thread 타입입니다. –

+0

@Rapunzo : 나는 그것을 읽을 수 없으며 질문에 섹션을 추가 할 수 있습니다. –

3

당신은 호출 방법