2011-03-01 7 views
11

ParameterizedThreadStart를 사용하여 스레드를 만드는 동안 문제가 발생했습니다.매개 변수화 된 스레드 만들기 문제

public class MyClass 
{ 
    public static void Foo(int x) 
    { 
     ParameterizedThreadStart p = new ParameterizedThreadStart(Bar); // no overload for Bar matches delegate ParameterizedThreadStart 
     Thread myThread = new Thread(p); 
     myThread.Start(x); 
    } 

    private static void Bar(int x) 
    { 
     // do work 
    } 
} 

내가 온라인으로 발견 된 예는 같은 일을하고있는 것으로 나타 때문에 내가 잘못 뭘하는지 정말 모르겠어요 : 여기에 내가 지금 가지고있는 코드입니다.

답변

16

대리자 형식은 object 매개 변수를 수락하는 서명이 있습니다.

당신은 기본적으로, 이런 식으로 뭔가를해야 할 것 :

// This will match ParameterizedThreadStart. 
private static void Bar(object x) 
{ 
    Bar((int)x); 
} 

private static void Bar(int x) 
{ 
    // do work 
} 
3

방법 Barobject 매개 변수를 받아 들여야한다. 내부에 int으로 전송해야합니다.

private static void Bar(int x) // Accepts int 

이 작업을 변경하려면 : 여기

public delegate void ParameterizedThreadStart(object obj); // Accepts object 

당신의 방법이다 :이 같은 ParameterizedThreadStart는 모습입니다

public static void Foo(int x) 
{ 
    ParameterizedThreadStart p = new ParameterizedThreadStart(o => Bar((int)o)); 
    Thread myThread = new Thread(p); 
    myThread.Start(x); 
} 

private static void Bar(int x) 
{ 
    // do work 
} 
7

: 나는 쓸모없는 방법을 만들지 않도록 여기 람다를 사용합니다 귀하의 방법 :

private static void Bar(object obj) 
{ 
    int x = (int)obj; 
    // todo 
} 
3
private static void Bar(object o) 
{ 
    int x = (int)o; 
    // do work 
} 
1

Bar 매개 변수에 object 아닌 int

private static void Bar(object x) 
{ 
    // do work 
} 
3
수행해야합니다 당신이 어떤 변수를 전달할 수 있도록 객체 인수를 기대하고있다에, 당신은 당신이 원하는 유형으로 캐스팅해야

당신은 하나 하나 개의 매개 변수를 가지고

private static void Bar(object ox) 
{ 
    int x = (int)ox; 
    ... 
} 

에 당신이 필요 ParameterisedThreadStart에 전달하는 기능을 줄을 변경해야 Object 유형의. 다른 건 없어.

관련 문제