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();
});
最后
我最后是用第三个方法成功实现了.