问题创建参数化线程

时间:2011-03-01 21:31:09

标签: c# multithreading parameterized

我在尝试使用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
    }
}

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

6 个答案:

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