博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#如何回到主线程,如何在委托指定线程执行
阅读量:4033 次
发布时间:2019-05-24

本文共 1310 字,大约阅读时间需要 4 分钟。

在多线程情况下,有时候我们需要在主线程里面执行一些逻辑,比如修改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
_action) { _action.Invoke(new Action(() => { Console.WriteLine($"窗体控件线程ID:{Thread.CurrentThread.ManagedThreadId}"); })); }

最后的执行结果如下

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

转载地址:http://kmkdi.baihongyu.com/

你可能感兴趣的文章
AsyncTask、View.post(Runnable)、ViewTreeObserver三种方式总结frame animation自动启动
查看>>
Android中AsyncTask的简单用法
查看>>
S3C6410启动模式介绍
查看>>
2440初始化存储器原理(接上一篇)
查看>>
S3C2440 USB 设备控制器(转)
查看>>
Linux usb 设备驱动 (1)
查看>>
解决跨网场景下,CAS重定向无法登录的问题(无需修改现有代码)
查看>>
java反编译命令
查看>>
activemq依赖包获取
查看>>
概念区别
查看>>
关于静态块、静态属性、构造块、构造方法的执行顺序
查看>>
final 的作用
查看>>
在Idea中使用Eclipse编译器
查看>>
idea讲web项目部署到tomcat,热部署
查看>>
优化IDEA启动速度,快了好多。后面有什么优化点,会继续往里面添加
查看>>
JMeter 保持sessionId
查看>>
IDEA Properties中文unicode转码问题
查看>>
Idea下安装Lombok插件
查看>>
zookeeper
查看>>
Idea导入的工程看不到src等代码
查看>>