C#线程启动时传入参数

我想不带参数的大家应该都会,如下
    class AAA 
    { 
        public static void Main() 
        { 
            Thread t = new Thread(new ThreadStart(A)); 
            t.Start(); 

            Console.Read(); 
        } 

        private static void A() 
        { 
            Console.WriteLine("Method A!"); 
        } 
    } 

若是带一个参数,Thread类的构造方法中提供了此项功能。如下,

    class AAA 
    { 
        public static void Main() 
        {        
            Thread t = new Thread(new ParameterizedThreadStart(B)); 
            t.Start("B"); 
            Console.Read(); 
        } 
        private static void B(object obj) 
        { 
            Console.WriteLine("Method {0}!",obj.ToString ()); 
        } 
    } 
但是若要带多个参数,就需要进行多一步的处理,处理方法很多,稍微举几例,

示例一:

借用对象的属性传值,将对象作为参数

    class AAA 
    { 
        public static void Main() 
        { 
            My m = new My(); 
            m.x = 2; 
            m.y = 3; 
            Thread t = new Thread(new ThreadStart(m.C)); 
            t.Start(); 
            Console.Read(); 
        } 
    class My 
    { 
        public int x, y; 
        public void C() 
        { 
            Console.WriteLine("x={0},y={1}", this.x, this.y); 
        } 
    } 

示例二:

借用结构体

    struct RowCol 
    { 
        public int row; 
        public int col; 
    }; 

    //定义方法 
    public void Output(Object rc) 
        { 
            RowCol rowCol = (RowCol)rc; 
            for (int i = 0; i < rowCol.row; i++) 
            { 
                for (int j = 0; j < rowCol.col; j++) 
                    Console.Write("{0} ", _char); 
                Console.Write("
"); 
            } 
        }

示例三,使用委托,

        static void Main(string[] args)
        {
            string name = "sfsfsf";
            string id = "12323";
            Thread th = new Thread(new ThreadStart(delegate()
                {
                    run(name, id);
                }));
            th.Start();
            Console.Read();
            th.Abort();
        }
        public static void run(string name, string id)
        {
            Console.WriteLine(name + "," + id);
        } 

最后一种方法,使用匿名参数,

    class Program
    {
        static void Main(string[] args)
        {
            string hello = "hello world";
            //如果写成Thread thread = new Thread(ThreadMainWithParameters(hello));这种形式,编译时就会报错
            Thread thread = new Thread(() => ThreadMainWithParameters(hello));
            thread.Start();
            Console.Read();
        }
        static void ThreadMainWithParameters(string str)
        {
             Console.WriteLine("Running in a thread,received: {0}", str);
        }
    }

匿名方法的使用使代码看上去简单明了,但我们一定要注意匿名方法会引发的一些不易察觉的问题,

其中就包括匿名方法引起的变量共享问题,有关此问题的详细介绍请参见

文章:http://www.2cto.com/kf/201112/113646.html。



原文地址:https://www.cnblogs.com/ice-/p/4244941.html