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
    }
}

我不太确定自己做错了什么,因为我在网上找到的示例似乎在做同样的事情。

4

6 回答 6

17

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

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

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

private static void Bar(int x)
{
    // do work
}
于 2011-03-01T21:33:32.497 回答
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
}
于 2011-03-01T21:35:07.033 回答
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
}
于 2011-03-01T21:33:39.300 回答
3

它需要一个对象参数,因此您可以传递任何变量,然后您必须将其转换为您想要的类型:

private static void Bar(object o)
{
    int x = (int)o;
    // do work
}
于 2011-03-01T21:35:33.680 回答
3

您需要将 Bar 更改为

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

您传递给 ParameterisedThreadStart 的函数需要有 1 个 Object 类型的单个参数。没有其他的。

于 2011-03-01T21:36:21.930 回答
1

Bar必须采用objectin 参数,而不是int

private static void Bar(object x)
{ 
    // do work
}
于 2011-03-01T21:35:35.370 回答