【C#】SynchronizationContext线程上下文简单说明

SynchronizationContext线程上下文说明

SynchronizationContext在通讯中充当传输者的角色,实现功能就是一个线程和另外一个线程的通讯

 那么SynchronizationContext的Send()和Post()

  Send() 是简单的在当前线程上去调用委托来实现(同步调用)。也就是在子线程上直接调用UI线程执行,等UI线程执行完成后子线程才继续执行。

 Post() 是在线程池上去调用委托来实现(异步调用)。这是子线程会从线程池中找一个线程去调UI线程,子线程不等待UI线程的完成而直接执行自己下面的代码。

————————————————

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
//SynchronizationContext线程上下文说明
//SynchronizationContext在通讯中充当传输者的角色,实现功能就是一个线程和另外一个线程的通讯
//那么SynchronizationContext的Send()和Post()
//Send() 是简单的在当前线程上去调用委托来实现(同步调用)。也就是在子线程上直接调用UI线程执行,等UI线程执行完成后子线程才继续执行。
// Post() 是在线程池上去调用委托来实现(异步调用)。这是子线程会从线程池中找一个线程去调UI线程,子线程不等待UI线程的完成而直接执行自己下面的代码。

namespace SynchronizationContextTest
{
     class ContextTest
     {
        static SynchronizationContext context;

        static void Main()
        {
            context = new SynchronizationContext();
            Console.WriteLine("主线程ID:"+ Thread.CurrentThread.ManagedThreadId);
            TestThread();
            Thread.Sleep(6000);
            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是在新的线程执行的(异步)

参考文章

【C#】【Thread】SynchronizationContext线程间同步 - 梦琪小生 - 博客园 (cnblogs.com)

猜你喜欢

转载自blog.csdn.net/weixin_46472622/article/details/129557937