C# SynchronizationContext執行緒上下文簡單說明
阿新 • • 發佈:2018-11-12
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是在新的執行緒執行的(非同步)
其它的不同後面再補充