C#如何回到主线程,如何在委托指定线程执行

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#如何回到主线程,如何在委托指定线程执行相关的知识,希望对你有一定的参考价值。

在多线程情况下,有时候我们需要在主线程里面执行一些逻辑,比如修改UI控件


SynchronizationContex可以帮助我们在指定的线程执行

SynchronizationContext.Current 为获取当前线程的同步上下文,拿到线程的上下文之后可以通过调用Send(同步)和Post (异步)将消息分派到同步上下文,以此实现在指定线程执行!


Invoke可以帮助我们在主线程执行

this.Invoke为当拥有此控件的基础窗口句柄的线程上执行指定的委托。通过传递此委托,可以在类库里面调用,以此达到在多线程情况下,依然可以随时在主线程里执行委托


SynchronizationContext mainThreadSynContext = SynchronizationContext.Current; Action action = null; Console.WriteLine($"主线程ID:{Thread.CurrentThread.ManagedThreadId}"); action += () => { Console.WriteLine($"委托线程ID:{Thread.CurrentThread.ManagedThreadId}"); }; Task.Run(() => { Console.WriteLine($"Task线程ID:{Thread.CurrentThread.ManagedThreadId}"); action?.Invoke(); mainThreadSynContext.Send(new SendOrPostCallback((ss) => { Console.WriteLine($"听说是主线程ID:{Thread.CurrentThread.ManagedThreadId}"); }), null);//通知主线程 s(this.Invoke); });void s(Func<Delegate, object> _action) { _action.Invoke(new Action(() => { Console.WriteLine($"窗体控件线程ID:{Thread.CurrentThread.ManagedThreadId}"); })); }

最后的执行结果如下



通过执行结果发现InvokeSynchronizationContext都是可以委托在主线程里执行的



以上是关于C#如何回到主线程,如何在委托指定线程执行的主要内容,如果未能解决你的问题,请参考以下文章

c#子线程执行完怎么通知主线程(转)

C#子线程执行完后通知主线程(转)

C# Winform 多线程异步委托进度条

c# 多线程运行时出现主界面卡死现象如何解决?

C# this.Invoke()的作用与用法

C# 线程调用主线程中的控件