2012-12-02 5 views
0

어떻게 다음과 같이 같이 내가 코드를 작성할 경우 오류 오류를 보여주는 아래의 방법 2가 스레드에 전달할 수 있습니다Thread 생성자에 메서드를 전달하는 방법은 무엇입니까?

'System.Threading.Thread.Thread (시스템에 가장 적합한 오버로드 된 메서드 .Threading.ThreadStart)는 ' 일부 잘못된 인수

class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("Main Thread : ");   
      Thread obj = new Thread(Method2); 
      obj.Start();     
      Console.ReadLine(); 
     }  
     private static int Method2(int a) 
     { 
      return a; 
     } 
    } 

내가 다음 코드를 사용하는 경우가

Thread obj = new Thread(() => Method2(1)); 
작동을 가지고 내가 위임 객체

delegate int del(int i); 

del d = Method2; 

Thread obj = new Thread(d); 

위의 2 사이의 차이는 다른 어떤 일이 있습니다 내가 직접 위임 객체 통과 번째 경우에 람다 표현식을 사용하는 첫번째 경우에, 무엇을 통과 할 때 왜

그러나이 작동하지 않습니다?

답변

1

Thread constructor에이 대표의 두 가지 유형, ThreadStartParameterizedThreadStart 걸립니다. 이 대표는 당신이 그것을 만들 수 있습니다 동의 방법의 유형을 확인하려면 생성자는 당신을 보여줄 것이다, 그래서 예를 들면

var parameterMethod = new ParameterizedThreadStart(... 

당신은 당신이 위의 대리자가 매개 변수로 하나의 객체와 함수를 취 볼 입력하면 void를 리턴합니다. 서명이 위임 대상 서명과 일치하지 않기 때문에 int를 취 귀하의 방법이 작동하지 않습니다 이유

void (object) target 

이입니다. lambada로 래핑 할 때 매개 변수를 사용하지 않고 void를 반환하는 메서드를 실제로 전달하므로 Method2 시그니처도으로 보지 않습니다. 이와 같은 lambada로 메소드 호출을 감싸는 것은 서명을 일치시키는 데 매우 유용 할 수 있습니다.

delegate void del(object obj); 
del d =() => Method2(1); 
Thread obj = new Thread(d); 

스레드와 작업이 간단하게 당신이 뭔가를 전달 하나의 개체를 전달하려면 말할 수 있도록 가능한 방법 서명의 무한한 수있다. 모든 유형은 객체에서 파생되므로 원하는 내용을 전달한 다음 나중에 캐스팅 할 수 있습니다.

1

이 시도 :

Thread obj = new Thread(() => Method2(some_int_value)); 
+0

ThanQ 괜찮 았지만 아래 그림과 같이 델리게이트 객체를 전달할 수는 없습니다. delegate int del (int var); static void Main (string [] args) { del d = Method2; Console.WriteLine ("Main Thread :"); 스레드 obj = 새 스레드 (d); – Gun

관련 문제