基礎才是重中之重~delegate裡的Invoke和BeginInvoke

張佔嶺發表於2018-05-24

回到目錄

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實現!

感謝閱讀!小小的知識點我們也要好好理解。

回到目錄

相關文章