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


線程函數要么沒有參數,要么只能有一個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;
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM