C#Threads -ThreadStart Delegate

执行以下代码会产生错误:ProcessPerson没有重载匹配ThreadStart。

public class Test { static void Main() { Person p = new Person(); p.Id = "cs0001"; p.Name = "William"; Thread th = new Thread(new ThreadStart(ProcessPerson)); th.Start(p); } static void ProcessPerson(Person p) { Console.WriteLine("Id :{0},Name :{1}", p.Id, p.Name); } } public class Person { public string Id { get; set; } public string Name { get; set; } } 

怎么解决?

首先,您需要ParameterizedThreadStartThreadStart本身没有任何参数。

其次, ParameterizedThreadStart只是object ,因此您需要将ProcessPerson代码更改为从objectPerson

 static void Main() { Person p = new Person(); p.Id = "cs0001"; p.Name = "William"; Thread th = new Thread(new ParameterizedThreadStart(ProcessPerson)); th.Start(p); } static void ProcessPerson(object o) { Person p = (Person) o; Console.WriteLine("Id :{0},Name :{1}", p.Id, p.Name); } 

但是,如果您使用的是C#2或C#3,则更清晰的解决方案是使用匿名方法或lambda表达式:

 static void ProcessPerson(Person p) { Console.WriteLine("Id :{0},Name :{1}", p.Id, p.Name); } // C# 2 static void Main() { Person p = new Person(); p.Id = "cs0001"; p.Name = "William"; Thread th = new Thread(delegate() { ProcessPerson(p); }); th.Start(); } // C# 3 static void Main() { Person p = new Person(); p.Id = "cs0001"; p.Name = "William"; Thread th = new Thread(() => ProcessPerson(p)); th.Start(); } 

您的函数声明应如下所示:

 static void ProcessPerson(object p) 

ProcessPerson ,您可以将’p’ ProcessPerson转换为Person对象。