C#中的delegate的 Invoke 、BeginInvoke的區別


事情是這樣的,我看到了以下的一段代碼,才引發了對這個問題的思考。代碼如下:

 1 using UnityEngine;
 2 using UnityEditor;
 3 
 4 public class CustomInspector : Editor
 5 {
 6     protected void WrapWithValidationColor(System.Action method, bool isValid, bool isValidWarning)
 7     {
 8         Color colorBackup = GUI.color;
 9         if (isValid == false)
10         {
11             GUI.color = Color.red;
12         }
13         else if (isValidWarning == false)
14         {
15             GUI.color = Color.yellow;
16         }
17         method.Invoke();
18         GUI.color = colorBackup;
19     }
20 }

就是看到第 17 行時候,我去查了一下相關資料,引發了對這個問題的思考。

看測試代碼:

 1 using System;
 2 using System.Threading;
 3 
 4 namespace CSharpTest
 5 {
 6     class Program
 7     {
 8         delegate void LugsTest();
 9 
10         static void Main(string[] args)
11         {
12             LugsTest lt = new LugsTest(ThreadSleep);
13             lt.Invoke();                        // 3s 后才打印
14             //lt.BeginInvoke(null, null);       //立即打印
15             Console.WriteLine("LugsTest()");
16             Console.ReadKey();
17         }
18 
19         static void ThreadSleep()
20         {
21             Thread.Sleep(3000);
22         }
23     }
24 }

具體的執行結果,注釋中寫有,而兩者的區別就是:

Invoke 是在主線程中執行,BeginInvoke 是另開一個線程執行。


免責聲明!

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



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