1. 程式人生 > 實用技巧 >C# SynchronizationContext執行緒上下文簡單說明

C# SynchronizationContext執行緒上下文簡單說明

SynchronizationContext執行緒上下文說明
SynchronizationContext在通訊中充當傳輸者的角色,實現功能就是一個執行緒和另外一個執行緒的通訊
 那麼SynchronizationContext的Send()和Post():
   Send() 是簡單的在當前執行緒上去呼叫委託來實現(同步呼叫)。也就是在子執行緒上直接呼叫UI執行緒執行,等UI執行緒執行完成後子執行緒才繼續執行。
   Post() 是線上程池上去呼叫委託來實現(非同步呼叫)。這是子執行緒會從執行緒池中找一個執行緒去調UI執行緒,子執行緒不等待UI執行緒的完成而直接執行自己下面的程式碼。

SynchronizationContext.Send(SendOrPostCallback d,object
state); 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是在新的執行緒執行的(非同步)。