如何将方法传递给Thread构造函数?

时间:2012-12-02 17:44:28

标签: c# multithreading

如果我编写如下所示的代码,如何将一个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表达式直接传递委托对象还有别的吗?

2 个答案:

答案 0 :(得分:1)

试试这个:

Thread obj = new Thread(() => Method2(some_int_value));

答案 1 :(得分:1)

Thread构造函数有两种类型的委托,ThreadStartParameterizedThreadStart。要查看这些委托接受的方法类型,您可以创建它,构造函数将向您显示,例如,

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,因此您可以传入任何想要的内容,然后再将其转换。