Проблема создания параметризованной нити
У меня возникают проблемы с созданием потока с параметрическим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
}
}
Я не совсем уверен, что я делаю неправильно, так как примеры, которые я нашел в Интернете, похоже, делают то же самое.
Ответы
Ответ 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
}