C#多线程下, 子线程如何让主线程执行方法
重现一下当时我的需求:
我开了多个线程, 来监视一个变量, 然后去执行一些方法.
看起来没什么毛病, 但是运行起来会报错
此对象被其他线程占用
一开始想着可能是冲突了加入了
lock(a)
{
someFunction();
}
是不太行的, 发现是主线程占用了, 也就引出了今天的.
如何让主线程去执行
如果是UI子类的话
因为UI一般也就是继承自DispatcherObject, 所以直接获取他的Dispatcher就行
bt1.Dispatcher.Invoke(()=>{
someFunction();
});
其他情况
可以使用SynchronizationContext.Current来获取当前线程的同步上下文
SynchronizationContext.Current.Send((e)=>
{
someFunction();
},null);
这个方法也并不是所有情况都可以, 官方文档已经明确给出了
在 Windows Store 应用程序中调用的方法。 用于 Windows Store 应用程序的 SynchronizationContext 的实现应用不支持 Send(SendOrPostCallback, Object) 方法。
注意了, Current可能为null
其他情况
使用Application.Current来获取当前的Application, 然后调用他的Dispatcher
Application.Current.Dispatcher.Invoke(() =>
{
someFunction();
});
最后
我最后是用第三个方法成功实现了.

本文探讨了在C#多线程环境下,如何避免主线程占用导致的问题,介绍了使用Dispatcher、SynchronizationContext和Application.Dispatcher来调度主线程执行方法的方法,并提供了实际应用场景和解决方案。
7786

被折叠的 条评论
为什么被折叠?



