Подтвердить что ты не робот

Проблема создания параметризованной нити

У меня возникают проблемы с созданием потока с параметрическимThreadStart. Вот код, который у меня есть сейчас:

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

Я не совсем уверен, что я делаю неправильно, так как примеры, которые я нашел в Интернете, похоже, делают то же самое.

4b9b3361

Ответ 1

Разочарочно, тип делегата ParameterizedThreadStart имеет подпись, принимающую один параметр object.

Вам нужно сделать что-то вроде этого, в основном:

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

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

Ответ 2

Вот что выглядит 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

Метод Bar должен принимать параметр object. Вы должны использовать int внутри. Я бы использовал лямбда здесь, чтобы избежать создания бесполезного метода:

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
}

Ответ 4

Ожидается аргумент объекта, поэтому вы можете передать любую переменную, тогда вы должны отдать его к типу, который вы хотите:

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

Ответ 5

Вам нужно изменить Bar на

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

Функция, которую вы передаете ParameterisedThreadStart, должна иметь один единственный параметр типа Object. Больше ничего.

Ответ 6

Bar должен принимать параметр object, а не int

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