基礎才是(shi)重中之重~delegate里(li)的Invoke和BeginInvoke
Invoke和BeginInvoke都(dou)是(shi)(shi)調用(yong)委托實(shi)(shi)體的方(fang)法,前者是(shi)(shi)同步(bu)調用(yong),即它(ta)運(yun)行(xing)(xing)在主線(xian)(xian)程上(shang),當Invode處理時(shi)間(jian)長(chang)時(shi),會(hui)(hui)出現阻塞的情(qing)況,而(er)BeginInvod是(shi)(shi)異步(bu)操(cao)作,它(ta)會(hui)(hui)從新開啟一個線(xian)(xian)程,所以不會(hui)(hui)租(zu)塞主線(xian)(xian)程,在使用(yong)BeginInvoke時(shi),如果希望(wang)等待(dai)執行(xing)(xing)的結果 ,可以使用(yong)EndInvoke來實(shi)(shi)現,這在.net framework4.5之后,被(bei)封(feng)裝成了async+await來實(shi)(shi)現,代碼(ma)更簡潔,更容易理解(jie)。
delegate void test(); static void Main(string[] args) { test ts = new test(TestDelegate); ts.Invoke(); //不會產生新線程(cheng) Console.WriteLine("hello"); } internal static void TestDelegate() { Thread.Sleep(1000); }
此時(shi),在主(zhu)線程中出現了1秒的(de)租塞,因為Invoke是同步的(de)。
下面再(zai)來看(kan)一(yi)下BeginInvoke的(de)實現
delegate string test(); static void Main(string[] args) { test ts = new test(TestDelegate); IAsyncResult result = ts.BeginInvoke(null,null); //會在新線程中(zhong)執(zhi)行(xing) string resultstr=ts.EndInvoke(result); Console.WriteLine(resultstr); } internal static string TestDelegate() { Thread.Sleep(1000); return "hello" }
上面的(de)代碼會在新線程中執(zhi)行,并且(qie)平會對主線程產(chan)生(sheng)租塞,同時它可(ke)以(yi)獲取自(zi)己的(de)返回值,使用EndInvoke實現!
感謝閱讀!小小的知識(shi)點我(wo)們(men)也(ye)要(yao)好好理(li)解。