C# SynchronizationContext執行緒上下文簡單說明
阿新 • • 發佈:2020-09-11
SynchronizationContext執行緒上下文說明
SynchronizationContext在通訊中充當傳輸者的角色,實現功能就是一個執行緒和另外一個執行緒的通訊
那麼SynchronizationContext的Send()和Post():
Send() 是簡單的在當前執行緒上去呼叫委託來實現(同步呼叫)。也就是在子執行緒上直接呼叫UI執行緒執行,等UI執行緒執行完成後子執行緒才繼續執行。
Post() 是線上程池上去呼叫委託來實現(非同步呼叫)。這是子執行緒會從執行緒池中找一個執行緒去調UI執行緒,子執行緒不等待UI執行緒的完成而直接執行自己下面的程式碼。
SynchronizationContext.Send(SendOrPostCallback d,objectstate); SynchronizationContext.Post(SendOrPostCallback d,object state);
測試程式碼:
using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ContextTest { class Program {static SynchronizationContext context; // 執行緒同步佇列,傳送接收socket回撥都放到該佇列,由poll執行緒統一執行 //private ConcurrentQueue<Action> queue = new ConcurrentQueue<Action>(); /// <summary> /// 測試上下文同步 /// SynchronizationContext /// </summary> /// <param name="args"></param>static void Main(string[] args) { context = new SynchronizationContext(); Console.WriteLine("主執行緒id:"+Thread.CurrentThread.ManagedThreadId); TestThread(); Thread.Sleep(6000); Console.WriteLine("主執行緒執行"); context.Send(EventMethod, "Send"); context.Post(EventMethod, "Post"); Console.WriteLine("主執行緒結束"); } static void TestThread() { var thrd= new Thread(Start); thrd.Start(); } static void Start() { Console.WriteLine("子執行緒id:" + Thread.CurrentThread.ManagedThreadId); context.Send(EventMethod, "子執行緒Send"); context.Post(EventMethod, "子執行緒Post"); Console.WriteLine("子執行緒結束"); } static void EventMethod(object arg) { Console.WriteLine("CallBack::當前執行緒id:" + Thread.CurrentThread.ManagedThreadId+" arg:"+(string)arg); } } }
結果:
根據結果分下得出:
Send是在當前執行緒執行的(同步);
Post是在新的執行緒執行的(非同步)。