关于那类难题网上查找会有许多缓解方案,但中央的情致都距离非常的小,差不离难题出于启用线程时调用类似剪贴板Clipboard.SetDataObject出错,作者把自身的测试代码显示下:

转自原来的小说ArcGIS Engine
中的多线程使用

直接都想写写AE中二十四线程的施用,但直接苦于未有时间,终于在仲八月节假期闲了下去。呵呵,闲话不说了,进入正题!

[STAThread]
STAThread:Single     Thread     Apartment
Thread.(单一线程单元线程)
[]是用来代表Attributes;

金沙注册送58 1

直白都想写写AE中二十四线程的接纳,但一向烦心未有时间,终于在中中秋节日假期期闲了下去。呵呵,闲话不说了,进入正题!

 

[STAThread]
是一种线程模型,用在程序的输入方法上(在C#和VB.NET里是Main()方法),来内定当前线程的ApartmentState
是STA。用在其余办法上不发出震慑。在aspx页面上能够选拔AspCompat =
“true”
【金沙注册送58】不行化解方案,中的拾2线程使用。 来达到相同的法力。那脾性格只在  Com  Interop  有用,假若全勤是 
managed  code 
则不行。不难的布道:[STAThread]指令应用程序的暗许线程模型是单线程单元
(STA)。运转线程模型可安装为单线程单元或二10四线程单元。若是未对其展开设置,则该线程不被初步化。也正是说如若你用的.NET
Framework,并且未有应用COM
Interop,壹般不须要以此Attribute。其它的还有MTA(三十二线程套间)、Free 
Thread(自由线程)。

 
化解方案:只需将thread.SetApartmentState(ApartmentState.STA);反注释就足以了。

       
我们都打听到ArcGIS中拍卖大数据量时进度是一定的慢,那时假诺您的主次是单线程的,那可就令人着急坏了,不知底处理到怎么地步,不能够操作其余的功力,无奈~~借使在那儿你可见想到用二十四线程技术,那就来尝试该怎么实现吗。

     
大家都询问到ArcGIS中处理大数据量时进程是一对一的慢,这时借使你的次序是单线程的,那可就令人焦急坏了,不知底处理到何以程度,不能够操作别的的职能,无奈~~借使在此时你可以想到用多线程技术,那就来试试该怎么着成功吗。

[STAThread] attribute提醒应用程序的 COM 线程模型是单线程单元。
而于此对应的八线程单元则是 [MTAThread] (十2线程单元线程)

  出现的缘由:

      
首先,你得某个VS的三十二线程经验或上学经验,得理解怎么样多线程,代理(Delegate)是哪些,同步与异步又是什么样,等等。那个在VS的帮扶文书档案中都有详细解释,在这里自个儿就不越职代理了。我们之中精神去明白ArcGIS中十二线程吧。

 

COM 线程模型只适用于采纳 COM interop
的应用程序。就算将此属性应用到不应用 COM interop
的应用程序,将从未别的功用。

*  单元是经过之中装有同等线程访问供给的对象的逻辑容器。同一单元中的全体指标都得以吸收从该单元中的任何线程发出的调用。
.NET Framework
不选取单元,托管对象自个儿负担以线程安全的不二秘籍利用具有共享财富。由于 COM
类使用单元,因而公共语言运营
库供给在 COM interop 的动静下调用 COM
对象时创建并伊始化2个单元。托管线程能够创建并跻身只同意有贰个线程的单线程单
元 (STA) 只怕隐含1个或多个线程的多线程单元 (MTA)。通过将线程的
ApartmentState 属性设置为 ApartmentState 枚举值之一
,能够控制所开创的单元的档次。由于给定线程只可以开首化 COM
单元三次,由此在首先次调用非托管代码之后就不可能更改单元类型。*

      
在ArcgIS中,大家分多少个部分演说二10二十四线程。

   
首先,你得稍微VS的八线程经验或学习经历,得精通哪些八线程,代理(Delegate)是何等,同步与异步又是何等,等等。那个在VS的协理文书档案中都有详尽分解,在此处本人就不越职代理了。我们个中精神去掌握ArcGIS中二十三十二线程吧。

COM 线程模型可安装为单线程单元或八线程单元。要是应用程序线程实际调用了
COM 组件,则仅为 COM interop 初叶化该线程。假设未有运用 COM
interop,则不早先化该线程。

注:在网络上找了两篇文章也许更能证实那一个标题。小说的忽视是,由于过多COM在.NET环境下1旦接纳多线程的话,会造成引用的COM不可能平常运维,
而假诺不申明程序为STAThread的话,.NET就会活动使用二十多线程来进步效能,那样就会招致不可预见的结局。

       1、曾几何时使用十二线程

 

以下是找到的二个材质介绍:
Q. When I create a c# project from scratch in VS.NET, the generated
code always have a [STAThread] attribute above the main routine. What
does the STAThread attribute really do? Can I change it to MTAThread
instead? I have searched website and books, no one seems to explain this
well.

  A young ilder ~ an old beggar !

在创制三十二线程应用程序是应留神两点:线程的安全性和线程的伸缩性。线程安全对于有所的目的都以尤其主要的,然则1味唯有线程安全的靶子并不代表成功创办二十多线程应用程序,大概说线程安全能够增长应用程序的性质。

      在ArcgIS中,我们分多少个部分解说多线程。

Asked by anon. Answered by the Wonk on February 17, 2003

.NET框架允许你在应用程序中能够相当的慢的制造线程,然而,在编写ArcObjects代码的多线程必须求小心。ArcObjects最根本的结构是组件对象模型(COM)。从那一点来说,编写ArcObjects的三十二线程的代码供给既领悟.NET十二线程,又要询问COM二十八线程模型。

 

A.

10二线程并不一而再使你的先后跑的火速,在不少景观下,它还会扩张费用和复杂,那几个最终会放慢程序的执行进度。当扩大的繁杂是值得的,那么二拾10贰线程才能动用。1个主干的尺度是,要是1个职分能够解释为不一样的独立职务时,那这几个职分是符合二十三十六线程的。

      1、哪一天使用八线程

The STAThreadAttribute marks a thread to use the Single-Threaded COM
Apartment if COM is needed. By default, .NET won’t initialize COM at
all. It’s only when COM is needed, like when a COM object or COM Control
is created or when drag ‘n’ drop is needed, that COM is initialized.
When that happens, .NET calls the underlying CoInitializeEx function,
which takes a flag indicating whether to join the thread to a
multi-threaded or single-threaded apartment.

二、ArcObjects线程模型

 

A multi-threaded apartment (MTA) in COM is more efficient, since any of
a number of RPC threads from a pool can be used to handle a request.
However, an object on the MTA thread needs to protect itself from
multiple threads accessing it at the same time, so that efficiency comes
at a cost.

抱有的ArcObjects组件都被标记为单线程单元(STA参考VS支持文书档案)。每一个STA都限制在3个线程中,不过COM并不限定种种过程中STA的数量。当3个方法调用进入三个STA,它被转换成STA的绝无仅有线程。因而,在STA中的贰个对象将1回只收到和拍卖2个措施调用,它接受的每种方法调用会到达同一线程。

在创设四线程应用程序是应注意两点:线程的安全性和线程的紧缩性。线程安全对于有所的目的都以那多少个关键的,可是只是只有线程安全的对象并不意味成功开创四线程应用程序,或许说线程安全可以狠抓应用程序的质量。

The single-thread apartment (STA) in COM is inherently single-threaded
and therefore no additional thread synchronization is needed. The STA is
implemented using the thread’s Windows message queue, which is how
requests to objects on an STA are serialized. Because of how the STA
thread is implemented, calls to objects on that thread are serialized
with Windows message handling on that thread, making sure that
everything, both the COM objects and the underlying windowing objects,
e.g. HWNDs, are all synchronized. This is necessary for UI-oriented COM
objects, like controls and drag ‘n’ drop, which must also be
synchronized together with the UI.

ArcObjects组件是线程安全的,开发者可把他们在四线程环境下使用。对于AO应用程序在二十四线程环境下有效运营,由AO所使用的线程单元模型,即单独线程,必须加以思索。该模型的干活原理是化解跨线程通讯。一个线程内拥有ArcObjects对象的引用应当只与在同三个线程的目标开始展览通讯。

 

When COM is needed .NET will call CoInitializeEx, picking the MTA by
default because it’s more efficient. However, to get the synchronization
needed for controls, windows and drag ‘n’ drop, you need to mark a
thread’s entry point with the STAThreadAttribute to let .NET know to
initialize the UI thread on the STA. All of the VS.NET project templates
put that attribute in to make sure you don’t forget:
大约意思是:由于广大COM在.NET环境下壹旦应用多线程的话,会导致引用的COM不能够符合规律运营,而如果不注解程序为STAThread的话,.NET就会活动使用二十八线程来升高功效,这样就会促成不可预感的结局。

对此此模型的运营,在ArcGIS
9.X中单个对象都被规划为线程唯壹,而非进度唯一。在经过中管理多个对象的能源消耗当先由抑制跨线程通讯所收获的质量提上升幅度度。

.NET框架允许你在应用程序中可见快速的创办线程,不过,在编写ArcObjects代码的二十四线程必供给小心。ArcObjects最根本的社团是组件对象模型(COM)。从那点来说,编写ArcObjects的四线程的代码须要既领悟.NET四线程,又要询问COM四线程模型。

以下引述另一同辈的演说:
**STA不是单线程的意思.英文为single threaded apartment.是一种套间(或译为公寓)线程格局.

对于扩充ArcGIS系统的开发者,全部指标竟然席卷你制造的靶子都不能够不及照这一规则,孤立线程工作。假使您创建的指标做为开发的一局地,你必须保险它们是线程唯1,而不是进度唯一。线程唯1便是谨防跨线程通讯,那里ArcGIS
Engine中十贰线程的严重性规则。

 

**sta thread并不注解应用软件的门类,和应用程序不搭界,恰相反,1个应用程序能够有四个线程.每种线程也足以有多个零部件或对象.从前win15人系统的组件线程方式才真正是单线程.那是壹种被淘汰了的情势.
线程形式用于拍卖组件在多线程的环境里并行与并互的格局.比如套间线程(STAThread)方式中接口跨线程传递必须被调度(马尔斯hal),不调度直传肯定会退步!而MTA或FreeThread格局中的接口能够不经调度直接传递.
那种调度在一定的条件中1二分影响属性(可有几百倍之差).如VB里只援助STAThread形式.FreeThread情势的零件会在内部表现成和跨进度壹样慢!
线程情势是微软的COM基础中的极其重要的概念.一定要吃透!
作者对.net真是愚蠢(没空去弄,对不起微软二零一八年的嘉奖).但本身可以一定,C#中的[STAThread]个性是应用程序的套间开端化代码.可以一向理解成SDK里的
CoInitialize(NULL); 
开班二个STA套间实际上是一定于开了二个音讯窗口,全部调用经此窗口进度调度到零部件内.
同理[MTAThread](不知有未有那特性情,自已去查)
能够知晓成
CoInitializeEx(NULL,COINIT_MULTITHREADED )
那常常是1个对初入com大门的人来说,有一定难度但必须过的壹道关.

三、八线程方案

102线程并不总是使您的先后跑的全速,在重重情景下,它还会大增开销和复杂性,这个最后会放慢程序的实践进程。当扩大的繁杂是值得的,那么拾贰线程才能使用。三个为主的原则是,固然三个职分能够解释为分化的单独使命时,那那么些职务是切合二10多线程的。

就算有为数不少完成多线程应用程序的法门,但以下二种方案是开发者日常应用的章程。

 

叁.一、后台线程执行长事务

二、ArcObjects线程模型

当需求必要长工作进行工作时,在后台执行长事务是长项的,并且同时让应用程序灵活的操作其余义务,并让界面处于响应状态。那1操作的事例很多,如:使用FeatureCursor来再一次向DataTable装载数据,举办复杂的拓扑总结并写入新的FeatureClass。为了达成那类义务,请记住以下几点:

 

a.
根据在孤立模型中的线程,你不可能在线程之间共享ArcObjects的组件。相反,你须求思考的是,单个对象都在分别线程中,并在后台线程中,例如全体工厂急需开辟FeatureClass,创设新的FeatureClass,设置空间参考等等。

富有的ArcObjects组件都被标记为单线程单元(STA参考VS支持文书档案)。每种STA都限制在3个线程中,但是COM并不限制每一个进程中STA的数据。当2个办法调用进入3个STA,它被转移到STA的唯一线程。因而,在STA中的一个目的将贰回只收到和处理三个措施调用,它接受的种种方法调用会到达同1线程。

金沙注册送58,b.传递给线程的具有音讯务必是总结类型或托管类型的样式。

 

c.万壹在某种景况下,你要从主线程向工作线程传递ArcObjects组件,可以将指标系列化成字符串,再将字符串传递给指标线程,然后再反体系化还原到目的。例如,你可以应用XmlSerializerClass类别化对象变成字符串,如工作区间(Workspace)连接属性(IPropertySet),再将这一字符串传递给目的线程,然后在办事线程中运用XmlSerializerClass反种类化连接属性。那样,就将接二连三属性对象在后台再一次创制出来,从而幸免了跨线程访问。

ArcObjects组件是线程安全的,开发者可把她们在多线程环境下行使。对于AO应用程序在八线程环境下有效运作,由AO所使用的线程单元模型,即独立线程,必须加以思索。该模型的劳作原理是清除跨线程通讯。叁个线程内所有ArcObjects对象的引用应当只与在同贰个线程的指标开始展览通讯。

当运维后台线程,你能够在用户界面领会职务的进程。

 

3.2、实施单机ArcObjects的应用程序

对此此模型的运营,在ArcGIS
玖.X中单个对象都被规划为线程唯1,而非进度唯1。在过程中管理七个目的的财富消耗超越由抑制跨线程通讯所取得的性质提上升幅度度。

正如微软开发人士网络(MSDN)网址上所说,“在.NET
Framework版本二.0中,如若线程的单元状态在开发银行前从未有过规定,新的线程就起来化为ApartmentState.MTA。主应用程序线程暗中同意开始化为ApartmentState.MTA。您不能够经过设置代码的首先行Thread.ApartmentState属性再设置主应用程序线程到ApartmentState.STA。而应使用STAThreadAttribute代替。”

 

用作ArcObjects的开发人士,这代表,倘诺你的应用程序不被视为三个单一线程应用程序起头化的,.NET框架将为具有的ArcObjects创造2个卓殊的单线程单元(STA)线程,因为她们被标记STA。那将招致对每八个从应用程序调用ArcObjects的线程切换来那几个一定的线程上来。反过来,那迫使ArcObjects组件合在1起调用,并最后以COM组件调用大概慢了约50倍。幸运的是,那可制止通过简单地方统一标准记首要功用为[STAThread]。

对于扩展ArcGIS系统的开发者,全部目的竟然席卷你成立的靶子都不可能不依据这一规则,孤立线程工作。假使你创立的目的做为开发的一部分,你必须保险它们是线程唯一,而不是进程唯1。线程唯一便是防备跨线程通讯,那里ArcGIS
Engine中10二线程的首要规则。

3.三、使用托管线程池和BackgroundWorker的线程

 

线程池线程都以往台线程。线程池通过提供一个由系统一管理理的行使程序线程池使您利用线程更有功效。利用为各类任务成立3个新线程的线程池的亮点是线程成立和销毁的开发是可忽略的,它可以带来更加好的性质和更加好的体系稳定。

三、多线程方案

可是,设计的具备ThreadPool线程是在十二线程单元(MTA),因而不该被用来运作ArcObjects,它们是单线程单元。若要消除此难题,您有二种选拔。二个是兑现二个专用ArcObjects的线程,它被标记为STAThread并委派种种从MTA线程调用这么些专用ArcObjects线程。另一种缓解方案是应用自定义的STA线程池的达成,如标记为STA线程的线程数组来运转ArcObjects。

 

三.4、同步运营线程的面世执行

固然有成都百货上千落实10贰线程应用程序的章程,但以下二种方案是开发者常常应用的措施。

在数见不鲜场馆下,您必须联合实施的出现运营的线程。平常,你要等待三个或四个线程完结他们的天职,当自然原则下获得满足,一个守候线程的实信号恢复生机其职分,条件如:测试是给定线否程激活和周转,改变线程优先级,或予以别的部分标准化。

 

在.NET中有二种方法来保管运转线程的施行。可用来帮助线程管理的首要几类如下:

叁.一、后台线程执行长事务

System.Threading.Thread;

 

System.Threading.WaitHandle;

当必要供给长工作举行工作时,在后台执行长事务是可取的,并且同时让应用程序灵活的操作别的任务,并让界面处于响应状态。这一操作的事例很多,如:使用FeatureCursor来再度向DataTable装载数据,举办复杂的拓扑总计并写入新的FeatureClass。为了形成那类任务,请记住以下几点:

System.Threading.Monitor;

 

System.Threading.AutoResetEvent and
System.Threading.ManualResetEvent。

a.依照在孤立模型中的线程,你不可能在线程之间共享ArcObjects的机件。相反,你须求考虑的是,单个对象都在分别线程中,并在后台线程中,例如全部工厂急需打开FeatureClass,创建新的FeatureClass,设置空间参考等等。

三.5、在多少个线程共享3个托管类型

 

有时你的.NET应用程序的底层数据结构将是三个如DataTable或哈希表管理的目的。这一个.NET托管对象允许你在八个线程共享数据获得,如线程和主线程渲染他们。不过,您应该咨询MSDN
Web站点以注脚这点是还是不是是线程安全的。在诸多气象下,一个对象是线程读安全,而写并不安全。某个集合实施联合方法,它提供了二个尾巴部分集合的壹起包装。

b.传递给线程的有所新闻必须是粗略类型或托管类型的款式。

在你的靶子被几个线程访问的图景下,依照MSDN关于那种状态的指标线程安全规则,你应当取得1个独占锁。取得如此的独占锁能够不辱职务地方所讲述的1块儿方法,或使用lock语句,它经过获得给定对象的互相排他锁标签叁个要害块。它能够保障,假设另二个线程试图访问对象时,它会被打断,直到该对象被放走(退出锁)。

 

三.6、从后台线程更新用户界面

c.万1在某种情况下,你要从主线程向工作线程传递ArcObjects组件,能够将指标系列化成字符串,再将字符串传递给指标线程,然后再反系列化还原到对象。例如,你能够选拔XmlSerializerClass种类化对象变成字符串,如工作区间(Workspace)连接属性(IPropertySet),再将这一字符串传递给目的线程,然后在办事线程中利用XmlSerializerClass反连串化连接属性。那样,就将接连属性对象在后台再度创设出来,从而制止了跨线程访问。

在大多数景况下,您正在选拔三个后台线程来执行长期的操作,你想向用户告知进程,状态,错误或此外与该线程执行的任务相关的信息。那足以经过创新叁个应用程序的用户界面控件来落实。不过,在Windows中,窗体控件绑定到三个一定的线程(经常是主线程),并且不是线程安全的。因而,你不可能不委派,从而组合,任何调用UI控件的线程来决定它的所属。该信托是透过调用Control.Invoke方法,该格局在线程上实施委托,该信托具备控件的根底窗口句柄。要表明调用者是不是必须调用Invoke方法,你能够应用性质Control.InvokeRequired。您必须保险该控件的句柄再尝试调用Control.Invoke或Control.InvokeRequired从前已经创建。

 

三.7、从叁个线程调用ArcObjects而不是主线程

当运营后台线程,你可见在用户界面掌握义务的进程。

在许多八线程应用程序中,你将索要从分化线程调用AO组件。例如,你恐怕有1个后台线程来博取Web服务,那反过来,应该增添新的类型到地图彰显,响应更改地图,或运营的geoprocessing(gp)的工具来实施有些类型分析。

 

2个11分常见的境况是从一个计时器事件处理方法调用ArcObjects。计时器的Elapsed事件是在二个线程池的天职提议,那不是三个主线程。可是,它须要选择ArcObjects,那好像是内需跨单元调用。但是,那足以幸免处理ArcObjects的零部件,就就像AO组件是3个用户界面控件和使用Invoke来调用委派到开创ArcObjects组件的主线程中。因而,未有跨单元调用。

叁.二、实施单机ArcObjects的应用程序

ISynchronizeInvoke接口包含的法门有Invoke,BeginInvoke,和EndInvoke。本身达成那些点子或许是一个千斤的天职。相反,你应当有您间接从System.Windows.Forms.Control继承的类如故你应有有二个助手类,它一连自小编控制件。要么选拔将提供二个不难而有效的对于调用方法的缓解方案。

 

 

正如微软开发人员网络(MSDN)网址上所说,“在.NET
Framework版本二.0中,借使线程的单元状态在开发银行前未有规定,新的线程就起来化为ApartmentState.MTA。主应用程序线程私下认可初始化为ApartmentState.MTA。您不能够通过安装代码的第一行Thread.ApartmentState属性再设置主应用程序线程到ApartmentState.STA。而应利用STAThreadAttribute代替。”

delegate SomethingClassType SomeDelegate(IArray array);
SomeDelegate del = new SomeDelegate(AnotherFunc);//AnotherFunc与SomeDelegate同样的形式
IAsyncResult ireslt = del.BeginInvoke(array, null, null);//异步操作
ProgressbarForm form = new ProgressbarForm();//异步操作中的进度条窗体
form.Show();
System.Windows.Forms.Application.DoEvents();
while (!ireslt.IsCompleted)
{
System.Windows.Forms.Application.DoEvents();
}
SomethingClassType something= del.EndInvoke(ireslt);
form.Close();

 

 以上是理论方面的阐释及1个自家支付进度中的二个代码片段,希望这么些能够帮忙你完结你的二十八线程程序。参考的素材如下:Windows
MSDN,ES宝马X3I 的开发者网址。

作为ArcObjects的开发人士,那表示,倘若您的应用程序不被视为3个单一线程应用程序伊始化的,.NET框架将为全数的ArcObjects创立一个新鲜的单线程单元(STA)线程,因为她俩被标记STA。那将导致对每贰个从应用程序调用ArcObjects的线程切换成那一个一定的线程上来。反过来,那迫使ArcObjects组件合在1起调用,并最终以COM组件调用大概慢了约50倍。幸运的是,那可幸免通过不难地方统一标准记主要功效为[STAThread]。

 

 

 

三.三、使用托管线程池和BackgroundWorker的线程

 

 

线程池线程皆现在台线程。线程池通过提供一个由系统一管理理的应用程序线程池使您使用线程更有功能。利用为各种任务成立3个新线程的线程池的优点是线程创制和销毁的付出是可忽略的,它能够拉动越来越好的本性和更加好的种类稳定。

 

然则,设计的具有ThreadPool线程是在二十10贰线程单元(MTA),由此不应该被用来运作ArcObjects,它们是单线程单元。若要化解此题材,您有三种选取。三个是兑现二个专用ArcObjects的线程,它被标记为STAThread并委派每一个从MTA线程调用那么些专用ArcObjects线程。另壹种缓解方案是利用自定义的STA线程池的兑现,如标记为STA线程的线程数组来运营ArcObjects。

 

叁.肆、同步运维线程的面世执行

 

在许多情形下,您必须同步施行的产出运营的线程。日常,你要等待3个或多个线程完毕他们的职责,当自然标准下获得知足,二个等候线程的信号恢复其职责,条件如:测试是给定线否程激活和周转,改变线程优先级,或给予其余部分准绳。

 

在.NET中有两种方法来管理运作线程的推行。可用来援助线程管理的首要几类如下:

 

System.Threading.Thread;

 

System.Threading.WaitHandle;

 

System.Threading.Monitor;

 

System.Threading.AutoResetEvent and System.Threading.ManualResetEvent。

 

叁.5、在多个线程共享三个托管类型

 

有时你的.NET应用程序的最底层数据结构将是2个如DataTable或哈希表管理的对象。那几个.NET托管对象允许你在四个线程共享数据获得,如线程和主线程渲染他们。不过,您应该咨询MSDN
Web站点以验证那点是不是是线程安全的。在诸多气象下,1个目的是线程读安全,而写并不安全。有些集合实施联合方法,它提供了1个底部集合的一路包装。

 

在你的目的被多少个线程访问的气象下,根据MSDN关于那种地方包车型大巴对象线程安全规则,你应该获得1个独占锁。取得这么的独占锁能够成功地点所讲述的一起方法,或利用lock语句,它经过取得给定对象的相互排他锁标签3个首要块。它能够有限支撑,假使另叁个线程试图访问对象时,它会被卡住,直到该对象被释放(退出锁)。

 

3.陆、从后台线程更新用户界面

 

在大部景色下,您正在使用2个后台线程来执行长期的操作,你想向用户告知进度,状态,错误或任何与该线程执行的职分相关的音讯。那足以由此创新三个应用程序的用户界面控件来兑现。可是,在Windows中,窗体控件绑定到3个一定的线程(经常是主线程),并且不是线程安全的。由此,你必须委派,从而结成,任何调用UI控件的线程来决定它的所属。该信托是通过调用Control.Invoke方法,该办法在线程上推行委托,该信托具备控件的基本功窗口句柄。要验证调用者是还是不是必须调用Invoke方法,你能够选取质量Control.InvokeRequired。您必须保险该控件的句柄再品尝调用Control.Invoke或Control.InvokeRequired在此以前曾经成立。

 

三.柒、从三个线程调用ArcObjects而不是主线程

 

在许多10贰线程应用程序中,你将索要从不一致线程调用AO组件。例如,你可能有三个后台线程来博取Web服务,那反过来,应该扩充新的花色到地图呈现,响应更改地图,或运维的geoprocessing(gp)的工具来施行某个品种分析。

 

2个可怜广阔的意况是从2个计时器事件处理方法调用ArcObjects。计时器的Elapsed事件是在1个线程池的天职建议,这不是1个主线程。然则,它须要选取ArcObjects,那就像是是急需跨单元调用。但是,那能够幸免处理ArcObjects的零件,就就像AO组件是三个用户界面控件和动用Invoke来调用委派到创建ArcObjects组件的主线程中。因而,没有跨单元调用。

 

ISynchronizeInvoke接口蕴涵的法子有Invoke,BeginInvoke,和EndInvoke。自个儿达成那个方式恐怕是二个千斤的任务。相反,你应有有您直接从System.Windows.Forms.Control继承的类仍然你应该有一个帮手类,它再而三自笔者控制件。要么选用将提供二个简短而卓有功效的对于调用方法的化解方案。

 

 

 

delegate SomethingClassType SomeDelegate(IArray array);

 

Func()

 

{

 

………………

 

          SomeDelegate del = new
SomeDelegate(AnotherFunc);//AnotherFunc与SomeDelegate同样的花样

 

          IAsyncResult ireslt = del.BeginInvoke(array, null,
null);//异步操作

 

 

 

          ProgressbarForm form = new
ProgressbarForm();//异步操作中的进程条窗体

 

          form.setProgressBar(“提醒”, “正在处理数据…”, 10, 0, 十0);

 

 

 

          form.Show();

 

          System.Windows.Forms.Application.DoEvents();

 

          while (!ireslt.IsCompleted)

 

          {

 

              System.Windows.Forms.Application.DoEvents();

 

          }

 

          SomethingClassType something= del.EndInvoke(ireslt);

 

          form.Close();

 

………

 

}

 

上述是辩论方面包车型客车解说及3个自家支付进度中的一个代码片段,希望那几个可以援助您做到你的多线程程序。参考的资料如下:Windows
MSDN,ES福睿斯I 的开发者网址。

小说出处:http://anshien.blog.163.com/blog/static/169966308201082441114173/

相关文章

网站地图xml地图