C#多线程下, 子线程如何让主线程执行方法

2 篇文章 0 订阅

C#多线程下, 子线程如何让主线程执行方法

重现一下当时我的需求:

我开了多个线程, 来监视一个变量, 然后去执行一些方法.

看起来没什么毛病, 但是运行起来会报错
此对象被其他线程占用
一开始想着可能是冲突了加入了

lock(a)
{
	someFunction();
}

是不太行的, 发现是主线程占用了, 也就引出了今天的.

如何让主线程去执行

如果是UI子类的话

因为UI一般也就是继承自DispatcherObject, 所以直接获取他的Dispatcher就行

bt1.Dispatcher.Invoke(()=>{
	someFunction();
});

关于DispatcherObject可以参考

其他情况

可以使用SynchronizationContext.Current来获取当前线程的同步上下文

SynchronizationContext.Current.Send((e)=>
{
	someFunction();
},null);

这个方法也并不是所有情况都可以, 官方文档已经明确给出了

在 Windows Store 应用程序中调用的方法。 用于 Windows Store 应用程序的 SynchronizationContext 的实现应用不支持 Send(SendOrPostCallback, Object) 方法。

详细的SynchronizationContext资料

注意了, Current可能为null

其他情况

使用Application.Current来获取当前的Application, 然后调用他的Dispatcher

Application.Current.Dispatcher.Invoke(() =>
{
	someFunction();
});

Application的文档

最后

我最后是用第三个方法成功实现了.

参考

没事多看MSDN

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值