c#发展

首页 » 常识 » 诊断 » C如何回到主线程,如何在委托指定线程执
TUhjnbcbe - 2021/3/23 15:54:00
白癜丸价格在哪个价位区间         http://m.39.net/pf/a_4342727.html

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

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

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

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

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

SynchronizationContextmainThreadSynContext=SynchronizationContext.Current;Actionaction=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(newSendOrPostCallback((ss)={Console.WriteLine($"听说是主线程ID:{Thread.CurrentThread.ManagedThreadId}");}),null);//通知主线程s(this.Invoke);});voids(FuncDelegate,object_action){_action.Invoke(newAction(()={Console.WriteLine($"窗体控件线程ID:{Thread.CurrentThread.ManagedThreadId}");}));}

最后的执行结果如下

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

预览时标签不可点收录于话题#个上一篇下一篇
1
查看完整版本: C如何回到主线程,如何在委托指定线程执