利用多線程,執行有返回值的方法


解決的問題:

      1. 當需要拿到多線程執行的方法的結果

      2. 如何讓主線程,等在所有的子線程直接結束

 

   

class Program
    {
        static void Main(string[] args)
        {

            IList<ManualResetEvent> listManual = new List<ManualResetEvent>();
            List<ThreadReturnData> testList = new List<ThreadReturnData>();
            for (int i = 0; i < 10; i++)
            {
                ThreadReturnData temp = new ThreadReturnData();
                temp.manual = new ManualResetEvent(false);
                temp.parm = "test";
                listManual.Add(temp.manual);
                testList.Add(temp);
                ThreadPool.QueueUserWorkItem(new WaitCallback(temp.ReturnThreadData), i);
            }

            //等待本次查詢線程全部執行完畢
            if (listManual.Count > 0)
            {
                WaitHandle.WaitAll(listManual.ToArray());
            }

            foreach (var item in testList)
            {
                Console.WriteLine(item.result);  //異步的結果
            }

        }


        public class ThreadReturnData
        {
            public ManualResetEvent manual;
            public string parm;
            public string result;

            public void ReturnThreadData(object info)
            {
                result = parm + info.ToString();
                manual.Set();
            }
        }

       在給子線程需要執行的方法傳遞參數的時候,可以用兩種方法,一種給該方法直接傳個參數例如上面的“i",還有一種方法就是,對於子線程需要執行的ReturnThreadData方法所在的實例temp設置一個屬性(parm),在需要執行方法錢給該屬性賦值( temp.parm = "test"),那么在方法中可以直接調用本實例的屬性。如何或者子線程執行的結果呢,原理更給參數賦值的第二種方式原理一樣,在方法所在的類ThreadReturnData中設置一個結果屬性(result),在方法執行完后把結果直接賦值給result,那么在主線程的temp實例中就可以獲取到執行的結果result。那么為什么主線程和子線程都能訪問到temp實例呢,temp實例實在主線程中創建的,在傳給子線程需要執行的WaitCallBack委托的時候,是把temp實例的ReturnThreadData傳遞給了該委托。但同時也會ReturnThreadData實例方法所在的實例也傳給委托(有個隱含的this參數就是temp實例),所以在執行委托方法時候可以直接引用到方法所在實例的屬性。本質上也就是引用類型的傳遞,只要引用類型的數據在某處引用的地方發生變化,那么在所以其他引用了這個引用類型的地方都可以獲取到這個變化。


免責聲明!

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



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