如果我编写如下所示的代码,如何将一个Method2传递给线程如下所示?它显示错误错误
最佳重载方法匹配 'System.Threading.Thread.Thread(System.Threading.ThreadStart)'有 一些无效的论点
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Main Thread : ");
Thread obj = new Thread(Method2);
obj.Start();
Console.ReadLine();
}
private static int Method2(int a)
{
return a;
}
}
当我使用以下代码时,它可以正常工作
Thread obj = new Thread(() => Method2(1));
但是当我传递委托对象时,为什么它不起作用
delegate int del(int i);
del d = Method2;
Thread obj = new Thread(d);
上面2之间有什么区别,在第一种情况下,我在第二种情况下使用Lambda表达式直接传递委托对象还有别的吗?
答案 0 :(得分:1)
试试这个:
Thread obj = new Thread(() => Method2(some_int_value));
答案 1 :(得分:1)
Thread
构造函数有两种类型的委托,ThreadStart
和ParameterizedThreadStart
。要查看这些委托接受的方法类型,您可以创建它,构造函数将向您显示,例如,
var parameterMethod = new ParameterizedThreadStart(...
如果键入以上内容,您将看到委托采用一个对象作为参数的函数并返回void。
void (object) target
这就是为什么你的带有int的方法不起作用,因为签名与委托目标签名不匹配。 当你将它包装在lambada中时,你实际上传递的方法不带参数并返回void,因此甚至没有查看Method2签名。使用像这样的lambada进行包装方法调用对于使签名匹配非常有用。
delegate void del(object obj);
del d = () => Method2(1);
Thread obj = new Thread(d);
有无数可能的方法签名,因此线程和任务保持简单,并说如果你想传递一些东西,传递一个对象。由于所有类型都派生自object,因此您可以传入任何想要的内容,然后再将其转换。