在BackGroundWorker中使用ArcGIS组件

2023-10-17 17:38

本文主要是介绍在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组件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/226925

相关文章

Java中Runnable和Callable的区别和联系及使用场景

《Java中Runnable和Callable的区别和联系及使用场景》Java多线程有两个重要的接口,Runnable和Callable,分别提供一个run方法和call方法,二者是有较大差异的,本文... 目录一、Runnable使用场景二、Callable的使用场景三、关于Future和FutureTa

Spring组件初始化扩展点BeanPostProcessor的作用详解

《Spring组件初始化扩展点BeanPostProcessor的作用详解》本文通过实战案例和常见应用场景详细介绍了BeanPostProcessor的使用,并强调了其在Spring扩展中的重要性,感... 目录一、概述二、BeanPostProcessor的作用三、核心方法解析1、postProcessB

使用EasyExcel实现简单的Excel表格解析操作

《使用EasyExcel实现简单的Excel表格解析操作》:本文主要介绍如何使用EasyExcel完成简单的表格解析操作,同时实现了大量数据情况下数据的分次批量入库,并记录每条数据入库的状态,感兴... 目录前言固定模板及表数据格式的解析实现Excel模板内容对应的实体类实现AnalysisEventLis

使用国内镜像源优化pip install下载的方法步骤

《使用国内镜像源优化pipinstall下载的方法步骤》在Python开发中,pip是一个不可或缺的工具,用于安装和管理Python包,然而,由于默认的PyPI服务器位于国外,国内用户在安装依赖时可... 目录引言1. 为什么需要国内镜像源?2. 常用的国内镜像源3. 临时使用国内镜像源4. 永久配置国内镜

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超

如何使用C#串口通讯实现数据的发送和接收

《如何使用C#串口通讯实现数据的发送和接收》本文详细介绍了如何使用C#实现基于串口通讯的数据发送和接收,通过SerialPort类,我们可以轻松实现串口通讯,并结合事件机制实现数据的传递和处理,感兴趣... 目录1. 概述2. 关键技术点2.1 SerialPort类2.2 异步接收数据2.3 数据解析2.

详解如何使用Python提取视频文件中的音频

《详解如何使用Python提取视频文件中的音频》在多媒体处理中,有时我们需要从视频文件中提取音频,本文为大家整理了几种使用Python编程语言提取视频文件中的音频的方法,大家可以根据需要进行选择... 目录引言代码部分方法扩展引言在多媒体处理中,有时我们需要从视频文件中提取音频,以便进一步处理或分析。本文

使用Dify访问mysql数据库详细代码示例

《使用Dify访问mysql数据库详细代码示例》:本文主要介绍使用Dify访问mysql数据库的相关资料,并详细讲解了如何在本地搭建数据库访问服务,使用ngrok暴露到公网,并创建知识库、数据库访... 1、在本地搭建数据库访问的服务,并使用ngrok暴露到公网。#sql_tools.pyfrom

使用mvn deploy命令上传jar包的实现

《使用mvndeploy命令上传jar包的实现》本文介绍了使用mvndeploy:deploy-file命令将本地仓库中的JAR包重新发布到Maven私服,文中通过示例代码介绍的非常详细,对大家的学... 目录一、背景二、环境三、配置nexus上传账号四、执行deploy命令上传包1. 首先需要把本地仓中要

Spring Cloud之注册中心Nacos的使用详解

《SpringCloud之注册中心Nacos的使用详解》本文介绍SpringCloudAlibaba中的Nacos组件,对比了Nacos与Eureka的区别,展示了如何在项目中引入SpringClo... 目录Naacos服务注册/服务发现引⼊Spring Cloud Alibaba依赖引入Naco编程s依