2014-11-13 3 views
0

두 개의 매개 변수를 전달하는 새 스레드를 만들려고하는데 너무 많은 시간을 검색했지만 아직 결과가 없습니다. 여기 내 방법 :두 개의 매개 변수를 전달하는 새 스레드를 만듭니다.

public void Add(int smallest, int biggest) 
{ 
    for (int i = smallest; i < biggest+1; i++) 
    { 
    Thread.Sleep(500); 
    result = result + i; 
    } 
} 

그리고 다음과 같이 수행 할 :

static void Main() 
    { 
     int x=10; 
     int y=100; 
     // in this line appear error 
     Thread t=new Thread(Add); 
     t.start(x,y); 
    } 
+0

오류의 원인을 아는 것이 도움이 될 것이라고 생각하십니까? – Blorgbeard

+0

이 문제를 이해하려고 노력하고 있지만 설명해 주시면이 문제를 더 빨리 이해할 수 있습니다. – GIANGPZO

+0

오류와 관련된 질문을 게시 할 때마다 항상 정확한 오류 메시지와 스택 추적의 관련 부분을 게시하십시오. "//이 줄에 오류가 나타납니다"라고 말하면 다른 모든 사람들이 당신이 어떤 오류를 겪고 있는지 알아 내야 만한다는 것을 의미합니다. 우리는 당신의 화면을 볼 수 없습니다. – Blorgbeard

답변

3

당신은 그런 식으로 할 수 없습니다. Thread.Start() 메서드에는 둘 이상의 매개 변수를 지원하는 오버로드가 포함되어 있지 않습니다.

static void Main() 
{ 
    int x=10; 
    int y=100; 
    // in this line appear error 
    Thread t=new Thread(() => Add(x, y)); 
    t.start(); 
} 

즉 :

그러나, 일반적인 목표는 쉽게 스레드 본문으로 익명의 방법을 사용하여 해결된다 Add() 메서드가 스레드 진입 점이되는 대신 익명 메서드 (여기에 람다 식 구문을 통해 선언 된)로 래핑합니다. xy 인수는 스레드가 시작될 때 Add() 메서드로 전달되는 익명 메서드에 의해 "캡처"됩니다.

매우 중요한주의 사항 : Add() 메서드를 실제로이라고하면 변수의 값은 에서만 검색됩니다. 그 때 스레드가 시작됩니다. 그렇게되기 전에 값을 수정하면 새 값이 사용됩니다.

이 관용구는 일반적으로 API에서 아무 것도 허용하지 않는 고정 된 숫자 (하나만있는 것처럼)를 허용하는 메서드에 강력한 형식의 인수 및/또는 여러 인수를 전달하려는 모든 상황에서 사용할 수 있습니다. 이벤트 처리기, Task 진입 점, I/O 콜백 등은 모두이 접근 방식을 사용할 수 있습니다.

+0

정말 고마워요. 당신의 대답이 내 문제와 완전히 일치했습니다. – GIANGPZO

0
public class ThreadObj 
{ 
public int smallest {get;set;} 
public int biggest {get;set;} 
} 

public void Add(object obj) 
{ 
ThreadObj myObj = (ThreadObj)obj; 
    for (int i = myObj.smallest; i < myObj.biggest+1; i++) 
    { 
    Thread.Sleep(500); 
    result = result + i; 
    } 
} 

static void Main() 
    { 
     Thread t=new Thread(Add); 
     t.start(new ThreadObj(){ smallest = 10, biggest = 100}); 
    } 

스레드 메소드는 매개 변수로 객체를 받아들입니다. 따라서 객체를 생성하고 그 객체에 값을 객체로 전달해야합니다.

+0

귀하의 게시물도 매우 helful입니다. 고맙습니다! – GIANGPZO

관련 문제