我在尝试使用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
}
}
我不确定我做错了什么,因为我在网上找到的例子似乎也在做同样的事情。
答案 0 :(得分:17)
令人沮丧的是,ParameterizedThreadStart
委托类型的签名接受一个object
参数。
你需要做这样的事情,基本上:
// This will match ParameterizedThreadStart.
private static void Bar(object x)
{
Bar((int)x);
}
private static void Bar(int x)
{
// do work
}
答案 1 :(得分: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
}
答案 2 :(得分:3)
方法Bar
应接受object
参数。你应该在内部施放int
。我会在这里使用lambdas来避免创建无用的方法:
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
}
答案 3 :(得分:3)
期望一个对象参数,所以你可以传递任何变量,然后你必须将它转换为你想要的类型:
private static void Bar(object o)
{
int x = (int)o;
// do work
}
答案 4 :(得分:3)
您需要将Bar更改为
private static void Bar(object ox)
{
int x = (int)ox;
...
}
传递给ParameterisedThreadStart的函数需要有1个Object类型的参数。没别了。
答案 5 :(得分:1)
Bar
必须在参数中使用object
,而不是int
private static void Bar(object x)
{
// do work
}