2012-03-21 3 views
0

Delay.cs스레드

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading; 

namespace LearnThread 
{ 
    class Delay 
    { 
     public int Convert() 
     { 
      int ErrorCode = 1; 
      //something 
      //takes long time. about 9 hours. 
      return ErrorCode; 
     } 
    } 
} 

Form1.cs를

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.Threading; 

namespace LearnThread 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void btnStart_Click(object sender, EventArgs e) 
     { 
      Delay delay = new Delay(); 
      Thread t = new Thread(delay.Convert); 
      //something 
      MessageBox.Show("Success"); 
     } 
    } 
} 

지연 지연 = 새로운 지연(); 반환 값이 예상되므로 여기에 오류가 있습니다. 오류 코드가 포함되어 있으므로 반환 값을 원합니다. 어떻게해야합니까? 배경 작업자가 스레드보다 낫다. 도와주세요. (delay.Convert()가 실행 중일 때 폼에 대한 제어권을 잃어서는 안됩니다.)

답변

2

ErrorCode을 클래스 멤버로 만듭니다. 이렇게하면 나중에 얻을 수 있습니다.

class Delay 
{ 
    public int ErrorCode { get; private set; } 
    public void Convert() 
    { 
     ErrorCode = 1; 
     ... 
    } 
} 


private void btnStart_Click(object sender, EventArgs e) 
{ 
    Delay delay = new Delay(); 
    Thread t = new Thread(delay.Convert); 
    //something 
    int error = delay.ErrorCode; 
    MessageBox.Show("Success"); 
} 
+1

경고입니다. 이러한 코드 스 니펫이 작업을 수행합니다. ErrorCode를 1로 설정하면 C#에서 매우 쉬운 작업입니다. 하지만, "Convert()"메소드에서 너무 많은 시간이 걸리므로 (중간 엔드 PC의 경우 5 초), btnStart_Click()에서 ErrorCode가 잘못됩니다. 당신이 스레드 조인을 호출하지 않았기 때문에, 메인 스레드와 떨어져 있고, 스레드가 어떤 식으로 끝날 때까지 기다리지 않았습니다 ... "// something"의 줄에서 뭔가를해야합니다 :) –

4

Juergen에서 언급했듯이 ErrorCode를 클래스 멤버로 설정 한 다음 스레드가 실행을 완료하면 액세스 할 수 있습니다. 여러 개의 Convert를 병렬로 실행하려는 경우 Delay 클래스의 새 인스턴스를 만들어야합니다. 다음과 같이

당신은 또한 btnStart_Click 함수의 변수에 반환 값을 얻을 수있는 대리자를 사용할 수 있습니다

private void button1_Click(object sender, EventArgs e) 
     { 
      Delay delay = new Delay(); 
      int delayResult = 0; 
      Thread t = new Thread(delegate() { delayResult = delay.Convert(); }); 
      t.Start(); 
      while (t.IsAlive) 
      { 
       System.Threading.Thread.Sleep(500); 
      } 
      MessageBox.Show(delayResult.ToString()); 
     } 

을 여기에 병렬로 변환을 실행하려는 경우, 당신은 지역의 많은 사람을 만들어야합니다 필요에 따라 변수를 변경하거나 다른 방법으로 처리하십시오.

+0

나는 이것이 더 나은 대답이라고 생각한다. 나는 왜 "유 르겐 d"대답을 설명했다. 그리고 Manoj를 잘라 줘서 고마워. –