C#祕密武器之多線程——參數與返回值

https://www.cnblogs.com/weige/p/4240564.html

線程函數要麼沒有參數,要麼只能有一個object參數,而且均沒有返回值,這樣就大大降低了程序的靈活性,其實我們想要的是能像普通方法一樣正常使用參數和返回值!能不能實現這個需求呢?下面就介紹兩種方法

一、添加外殼方法
原理:把參數傳遞變成了對變量的調用

方法:定義一個專門的線程類。
1、需要向線程傳遞的參數和返回值作爲類的公共屬性;
2、線程函數的真正方法也放在該類裏邊
3、加殼的線程函數也放在裏邊(真正調用的是2的方法)

​
public class MyThread
{
    public double X= 10;
    public double Y= 0;    public double Result; 
    public MyThread(int x,int y)
    {
        this.X= X;        
        this.Y= y;   
    }    
    //真正方法
    public double SomeFunc(double x,double y)  
    {        
          //加法運算等   
    }    
    //加殼方法
    public void Calculate()
    {
        Result = SomeFunc(X,Y);     }
}

MyThread t=new MyThread(){X=1,Y=2};
ThreadStart threadStart=new ThreadStart(t.Calculate)
Thread thread=new Thread(threadStart);
thread.Start();thread.Join();Console.WriteLine(t.Result);

}

​

二、設計一個輸入輸出輔助類
既然ParameterizedThreadStart委託類型的線程函數可以輸入一個object類型的參數,那麼我們就從這個類型的參數入手:將線程函數的“輸入參數”和“返回值”封裝在一個類裏邊,這個類的實例就作爲這個唯一的object參數,上代碼一切就明白了!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            MyThread obj = new MyThread();
            ThreadMethodHelper argu = new ThreadMethodHelper();
            argu.x = 5;
            argu.y = 10;
            Thread t = new Thread(obj.SomeFunc);
            t.Start(argu);
            t.Join();
            Console.WriteLine(argu.returnValue);
            Console.Read();
        }
    }
    class ThreadMethodHelper
    {
        //方法參數
        public int x;
        public int y;
        //方法返回值
        public long returnValue;
    }
    class MyThread 
    {
        public void SomeFunc(object argu) 
        {
            long result = 0;
            int x = (argu as ThreadMethodHelper).x;
            int y = (argu as ThreadMethodHelper).y;
            result = x + y;
            (argu as ThreadMethodHelper).returnValue = result;
        }
    }
}

 

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