开发者

C# Threads -ThreadStart Delegate

开发者 https://www.devze.com 2022-12-12 10:23 出处:网络
The execution of the following code yields error :No overloads of ProcessPerson Matches ThreadStart. public class Test

The execution of the following code yields error :No overloads of ProcessPerson Matches 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;
        }


    }

How to fix it?


Firstly, you want ParameterizedThreadStart - ThreadStart itself doesn't have any parameters.

Secondly, the parameter to ParameterizedThreadStart is just object, so you'll need to change your ProcessPerson code to cast from object to 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);
}

However, if you're using C# 2 or C# 3 a cleaner solution is to use an anonymous method or lambda expression:

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();
}


Your function declaration should look like this:

static void ProcessPerson(object p)

Inside ProcessPerson, you can cast 'p' to a Person object.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号