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

示例三,使用委託,

        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。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章