0

如果我编写如下所示的代码,如何将 Method2 传递给线程,如下所示,它显示错误 Error

'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 表达式直接传递委托对象还有什么别的吗?

4

2 回答 2

1

试试这个:

Thread obj = new Thread(() => Method2(some_int_value));
于 2012-12-02T17:50:13.927 回答
1

构造Thread函数接受两种类型的委托,ThreadStartParameterizedThreadStart. 要查看这些委托接受什么类型的方法,您可以创建它,构造函数会显示给您,例如,

var parameterMethod = new ParameterizedThreadStart(...

如果您键入上述内容,您将看到委托接受一个以一个对象作为参数的函数并返回 void。

void (object) target

这就是为什么采用 int 的方法将不起作用的原因,因为签名与委托目标签名不匹配。当你把它包装在一个lambad中时,你实际上是在传递一个不带参数并返回void的方法,所以甚至没有看Method2签名。使用像这样的 lambda 包装方法调用对于使签名匹配非常有用。

delegate void del(object obj);
del d = () => Method2(1);
Thread obj = new Thread(d);

有无数种可能的方法签名,所以线程和任务保持简单,如果你想传递一些东西,传递一个对象。由于所有类型都派生自对象,因此您可以传入任何您想要的内容,然后再进行转换。

于 2012-12-02T18:39:39.897 回答