Invoke和BeginInvoke都是呼叫委託實體的方法,前者是同步呼叫,即它執行在主執行緒上,當Invode處理時間長時,會出現阻塞的情況,而BeginInvod是非同步操作,它會從新開啟一個執行緒,所以不會租塞主執行緒,在使用BeginInvoke時,如果希望等待執行的結果 ,可以使用EndInvoke來實現,這在.net framework4.5之後,被封裝成了async+await來實現,程式碼更簡潔,更容易理解。
delegate void test(); static void Main(string[] args) { test ts = new test(TestDelegate); ts.Invoke(); //不會產生新執行緒 Console.WriteLine("hello"); } internal static void TestDelegate() { Thread.Sleep(1000); }
此時,在主執行緒中出現了1秒的租塞,因為Invoke是同步的。
下面再來看一下BeginInvoke的實現
delegate string test(); static void Main(string[] args) { test ts = new test(TestDelegate); IAsyncResult result = ts.BeginInvoke(null,null); //會在新執行緒中執行 string resultstr=ts.EndInvoke(result); Console.WriteLine(resultstr); } internal static string TestDelegate() { Thread.Sleep(1000); return "hello" }
上面的程式碼會在新執行緒中執行,並且平會對主執行緒產生租塞,同時它可以獲取自己的返回值,使用EndInvoke實現!
感謝閱讀!小小的知識點我們也要好好理解。