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; } }
怎么解决?
首先,您需要ParameterizedThreadStart
– ThreadStart
本身没有任何参数。
其次, ParameterizedThreadStart
只是object
,因此您需要将ProcessPerson
代码更改为从object
为Person
。
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
对象。