解決的問題:
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實例),所以在執行委托方法時候可以直接引用到方法所在實例的屬性。本質上也就是引用類型的傳遞,只要引用類型的數據在某處引用的地方發生變化,那么在所以其他引用了這個引用類型的地方都可以獲取到這個變化。
