2012-12-02 57 views
0

如何传递如果如图我编写代码在它下面示出一个错误错误一个方法2线程如下面如何将方法传递给线程构造函数?

为 “System.Threading.Thread.Thread(系统最好重载方法匹配.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表达式有任何别人的事情吗?

回答

1

Thread constuctor采取两种代表,ThreadStartParameterizedThreadStart。看到这些代表接受哪种类型的方法,你可以创建和构造器会告诉你,因此,例如,

var parameterMethod = new ParameterizedThreadStart(... 

如果键入上面你会看到代表将一个函数与一个对象作为参数并返回void。

void (object) target 

这就是为什么你的方法接受一个int不会起作用,因为签名不委托目标特征匹配。 当你将它包装在一个lambda中时,实际上传入了一个不带参数并返回void的方法,所以Method2签名甚至不在。使用类似lambda的包装方法调用可以使签名匹配非常有用。

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

有可能的方法签名无限数量如此线程和任务保持简单,说,如果你想传递的东西,通过一个单一的对象。因为所有类型都是从对象派生的,所以这可以让你传入任何你想要的东西,然后再抛出。

1

试试这个:

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

ThanQ它工作正常,但我们不能通过代理对象,而不是像下面所示 '委托int del(int var); static void Main(string [] args) del d = Method2; Console.WriteLine(“Main Thread:”); 线程obj =新线程(d);' – Gun