2011-03-01 46 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

令人沮丧的是,ParameterizedThreadStart委托类型的签名接受一个object参数。

你需要做这样的事情,基本上是:

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

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

方法Bar应该接受object参数。你应该投到int里面。我会用lambda表达式在这里,以避免产生无用的方法:

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

这是ParameterizedThreadStart样子:

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

这里是你的方法:

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

为了使这项工作,改变您的方法为:

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需要的功能有1个单参数类型的对象。没有其他的。