本文主要是介绍在BackGroundWorker中使用ArcGIS组件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
有一段代码用到了ArcGIS的组件(实例中用到的是Geometry命名空间下的投影转换函数),正常在主线程下运行时是正常的,但由于运行时间长,用户体验较差,就想把这部分代码放在BackGroundWorker下面运行,以提高用户体验,但迁移到BGW下时,发现无法正常运行了,
上网查了一下,似乎是ArcGIS的COM组件必须在STA模式下运行
(关于什么是STA STA:single thread apartment MTA:mutiple thread apartment
可以参考这个: http://blog.sina.com.cn/s/blog_4e5ce4610100b645.html)
但BGW只能是在MTA下运行,所以ArcGIS组件运行不正常
这个观点没有实际验证,有人针对这个给出了解决方案,大致思想是,不使用BackGroundWorker,而使用Thread实现(因为Thread可以设置在STA模式下运行,而BGW是包装过的,不可以)
实现方法在此: http://stackoverflow.com/questions/658301/threading-and-arcgis
还有一种观点:可以在BGW里通过Invoke调用,可以解决线程间的复杂问题,具体的方法为:
void bgw_DoWork(object sender, DoWorkEventArgs e)
{
this.Invoke((MethodInvoker)delegate
{
//ArcGIS相关操作
});
}
经测试,成功,但也有人说这样同样会造成线程阻塞,用户体验下降,这个问题可以尝试这样:
如果BGW里的主要耗时部分是ArcGIS的代码,那么就只能尝试第一种解决方案
如果BGW里的主要耗时部分是非ArcGIS的代码,那么把ArcGIS相关代码使用Invoke包起来即可,其它的代码可以放在invoke外面
这篇关于在BackGroundWorker中使用ArcGIS组件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!