【www.30064.com】那多少个消除方案,中的二十10二线程使用

 
关于那类难点网上查找会有过多缓解方案,但中央的情致都距离相当小,大约难题出于启用线程时调用类似剪贴板Clipboard.SetDataObject出错,小编把自个儿的测试代码显示下:

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

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

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

www.30064.com 1

直白都想写写AE中二十八线程的行使,但直接烦心未有时间,终于在乾月夕假期闲了下来。呵呵,闲话不说了,进入正题!

 

[STAThread]
是一种线程模型,用在程序的输入方法上(在C#和VB.NET里是Main()方法),来钦点当前线程的ApartmentState
是STA。用在别的方法上不爆发潜移默化。在aspx页面上得以接纳AspCompat =
“true”
来达到平等的遵守。那性格情只在  Com  Interop  有用,假诺全部是 
managed  code 
则不算。简来讲之教:[STAThread]指令应用程序的暗许线程模型是单线程单元
(STA)。运行线程模型可设置为单线程单元或二十八线程单元。借使未对其开始展览安装,则该线程不被开首化。也正是说如若您用的.NET
Framework,并且未有运用COM
Interop,壹般不要求以此Attribute。其它的还有MTA(拾2线程套间)、Free 
Thread(自由线程)。

 
消除方案:只需将thread.SetApartmentState(ApartmentState.STA);反注释就能够了。

       
大家都询问到ArcGIS中处理大数据量时进程是一对1的慢,那时倘使你的顺序是单线程的,那可就令人着急坏了,不领悟处理到哪些地步,不能够操作别的的作用,无奈~~纵然在那时候你可知想到用多线程技能,这就来尝试该怎么完结吗。

     
大家都了然到ArcGIS中拍卖大数据量时进程是一定的慢,那时借使您的次第是单线程的,那可就令人干着急坏了,不知底处理到怎么样地步,不能够操作别的的遵守,无奈~~要是在那时你可见想到用二十多线程本领,那就来试试该怎么产生吗。

[STAThread] attribute提示应用程序的 COM 线程模型是单线程单元。
而于此对应的10贰线程单元则是 [MTAThread] (二10十二线程单元线程)

  现身的因由:

      
首先,你得某个VS的八线程经验或上学经验,得清楚什么样八线程,代理(Delegate)是哪些,同步与异步又是什么样,等等。这一个在VS的提携文书档案中都有详细分解,在此地作者就不越职代理了。大家当中精神去理解ArcGIS中102线程吧。

 

COM 线程模型只适用于选用 COM interop
的应用程序。假如将此属性应用到不采取 COM interop
的应用程序,将从未其余作用。

*  单元是进度之中装有同样线程访问要求的指标的逻辑容器。同1单元中的全体目的都足以接过从该单元中的任何线程发出的调用。
.NET Framework
不选取单元,托管对象本人承担以线程安全的章程选取全数共享财富。由于 COM
类使用单元,由此公共语言运维
库须求在 COM interop 的气象下调用 COM
对象时创制并初步化贰个单元。托管线程能够成立并进入只同意有1个线程的单线程单
元 (STA) 可能隐含1个或三个线程的二拾四线程单元 (MTA)。通过将线程的
ApartmentState 属性设置为 ApartmentState 枚举值之壹
,能够垄断所创办的单元的体系。由于给定线程只可以开始化 COM
单元2回,因而在率先次调用非托管代码之后就不能改换单元类型。*

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

   
首先,你得多少VS的二10多线程经验或学习经历,得精晓怎么着多线程,代理(Delegate)是如何,同步与异步又是怎么着,等等。这个在VS的扶植文书档案中都有详尽表达,在此间本人就不越职代理了。我们中间精神去精晓ArcGIS中二十四线程吧。

COM 线程模型可安装为单线程单元或二十四线程单元。假使应用程序线程实际调用了
COM 组件,则仅为 COM interop 起头化该线程。假若未有利用 COM
interop,则不开始化该线程。

注:在网络上找了两篇小说也许更能证实那几个标题。文章的忽视是,由于众多COM在.NET环境下一旦选用十二线程的话,会形成引用的COM无法符合规律运营,
而如果不证明程序为STAThread的话,.NET就会活动使用10贰线程来提升效能,那样就会形成不可预见的结局。

       一、曾几何时使用二十八线程

 

以下是找到的三个素材介绍:
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 www.30064.com,!

在创制10二线程应用程序是应小心两点:线程的安全性和线程的伸缩性。线程安全对于有着的靶子都以不行主要的,然而1味唯有线程安全的目的并不表示成功创办二十四线程应用程序,可能说线程安全能够增长应用程序的习性。

      在ArcgIS中,我们分多少个部分演说二十四线程。

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

.NET框架允许你在应用程序中可见赶快的始建线程,可是,在编写ArcObjects代码的多线程必必要小心。ArcObjects最根本的布局是组件对象模型(COM)。从这点来说,编写ArcObjects的二十多线程的代码须求既通晓.NET四线程,又要明白COM二10拾贰线程模型。

 

A.

10贰线程并不总是使您的次第跑的高效,在无数情形下,它还会大增费用和复杂,那些最后会减速程序的推行进程。当扩充的复杂性是值得的,那么八线程才具使用。1个基本的基准是,即便1个职分能够表明为不相同的独自任务时,那这几个义务是切合二拾10贰线程的。

      一、何时使用二十八线程

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.

2、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都限制在三个线程中,不过COM并不限制各种过程中STA的多寡。当1个办法调用进入三个STA,它被撤换来STA的绝无仅有线程。由此,在STA中的贰个指标将一回只接收和拍卖二个艺术调用,它接受的各个方法调用会达到同一线程。

在成立多线程应用程序是应小心两点:线程的安全性和线程的伸缩性。线程安全对于具备的靶子都以十分关键的,然而单纯唯有线程安全的目的并不意味成功开创多线程应用程序,只怕说线程安全能够坚实应用程序的属性。

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组件是线程安全的,开采者可把他们在拾2线程环境下利用。对于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无法健康运维,而1旦不阐明程序为STAThread的话,.NET就会自行使用四线程来进步作用,那样就会促成不可预见的结果。

对于此模型的运行,在ArcGIS
九.X中单个对象都被设计为线程唯1,而非进度唯一。在进程中管理多少个目的的能源消耗当先由抑制跨线程通讯所获取的属性提上涨的幅度度。

.NET框架允许你在应用程序中可见高效的创设线程,可是,在编写ArcObjects代码的拾2线程必须求小心。ArcObjects最根本的构造是组件对象模型(COM)。从那点来讲,编写ArcObjects的二十八线程的代码需求既理解.NET拾二线程,又要询问COM八线程模型。

以下引述另一齐辈的演讲:
【www.30064.com】那多少个消除方案,中的二十10二线程使用。**STA不是单线程的意思.英文为single threaded apartment.是1种套间(或译为公寓)线程形式.

对此增添ArcGIS系统的开辟者,全体指标竟然包涵你成立的靶子都不可能不依照那一规则,孤立线程职业。假诺你创设的目的做为开垦的壹部分,你不能够不保障它们是线程唯壹,而不是进程唯一。线程唯1便是严防跨线程通讯,那里ArcGIS
Engine中十二线程的重要性规则。

 

**sta thread并不申明应用软件的种类,和应用程序不搭界,恰相反,3个应用程序能够有多个线程.每个线程也足以有多个零件或对象.从前win十多人系统的机件线程格局才真的是单线程.那是一种被淘汰了的格局.
线程方式用于拍卖组件在二十八线程的环境里并行与并互的格局.比如套间线程(STAThread)情势中接口跨线程传递必须被调度(马尔斯hal),不调度直传确定会失利!而MTA或FreeThread情势中的接口能够不经调度间接传递.
那种调度在特定的环境中格外影响属性(可有几百倍之差).如VB里只帮助STAThread格局.FreeThread形式的组件会在里头表现有和跨进程同样慢!
线程格局是微软的COM基础中的极其主要的概念.一定要了如指掌!
小编对.net真是拙劣(没空去弄,对不起微软2018年的嘉勉).但本人能够一定,C#中的[STAThread]属性是应用程序的套间开端化代码.能够一贯理解成SDK里的
CoInitialize(NULL); 
初阶3个STA套间实际上是一定于开了3个音信窗口,全体调用经此窗口进度调度到零部件内.
同理[MTAThread](不知有未有那几个天性,自已去查)
能够清楚成
CoInitializeEx(NULL,COINIT_MULTITHREADED )
那平常是二个对初入com大门的人的话,有一定难度但不能够可是的1道关.

三、二十四线程方案

三十二线程并不三番五次使你的先后跑的急速,在成千上万场合下,它还会追加支出和复杂,这个最终会减速程序的实施进度。当扩展的纷纭是值得的,那么十2线程工夫应用。二个中央的规则是,假诺3个职分能够分解为差异的独门任务时,那那些任务是契合二十多线程的。

就算有成都百货上千兑现二10十六线程应用程序的章程,但以下三种方案是开辟者日常接纳的措施。

 

三.壹、后台线程实践长事务

二、ArcObjects线程模型

当要求须求长工作进行工作时,在后台推行长事务是亮点的,并且同时让应用程序灵活的操作别的任务,并让分界面处于响应状态。这一操作的例证许多,如:使用FeatureCursor来重新向DataTable装载数据,进行复杂的拓扑计算并写入新的FeatureClass。为了做到那类职务,请牢记以下几点:

 

a.
依据在孤立模型中的线程,你不能够在线程之间共享ArcObjects的零部件。相反,你须求牵记的是,单个对象都在各自线程中,并在后台线程中,例如全体工厂需求开荒FeatureClass,创设新的FeatureClass,设置空间参考等等。

怀有的ArcObjects组件都被标识为单线程单元(STA参考VS援救文书档案)。每一种STA都限制在三个线程中,可是COM并不限定每一个进程中STA的数量。当二个艺术调用进入2个STA,它被撤换成STA的绝无仅有线程。因而,在STA中的二个目的将3遍只收到和拍卖二个办法调用,它接受的每一个方法调用会达到同1线程。

b.传递给线程的持有消息必须是粗略类型或托管类型的花样。

 

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

ArcObjects组件是线程安全的,开辟者可把他们在102线程环境下行使。对于AO应用程序在十二线程环境下有效运作,由AO所使用的线程单元模型,即单独线程,必须加以思虑。该模型的行事规律是扫除跨线程通讯。一个线程内具有ArcObjects对象的引用应当只与在同一个线程的目的举办通信。

当运转后台线程,你可见在用户分界面明白任务的快慢。

 

3.二、施行单机ArcObjects的应用程序

对此此模型的运作,在ArcGIS
9.X中单个对象都被规划为线程唯1,而非进度唯一。在经过中管理多少个对象的财富消耗当先由抑制跨线程通讯所获得的性质进步幅度。

正如微软开垦职员网络(MSDN)网址上所说,“在.NET
Framework版本2.0中,即使线程的单元状态在运营前未有规定,新的线程就开始化为ApartmentState.MTA。主应用程序线程默许开端化为ApartmentState.MTA。您不能够因而安装代码的第一行Thread.ApartmentState属性再设置主应用程序线程到ApartmentState.STA。而应接纳STAThreadAttribute替代。”

 

用作ArcObjects的开拓人士,那意味,假若你的应用程序不被视为二个单1线程应用程序开头化的,.NET框架将为具备的ArcObjects创制二个奇特的单线程单元(STA)线程,因为他们被标识STA。那将招致对每三个从应用程序调用ArcObjects的线程切换来这些一定的线程上来。反过来,那迫使ArcObjects组件合在一齐调用,并最终以COM组件调用只怕慢了约50倍。幸运的是,那可制止通过轻松地方统一标准记首要功能为[STAThread]。

对此扩展ArcGIS系统的开采者,全体目标竟然包含你创建的靶子都不能够不遵守这一规则,孤立线程工作。假若你创建的指标做为开垦的1部分,你必须保险它们是线程唯壹,而不是经过唯一。线程唯1正是防御跨线程通讯,那里ArcGIS
Engine中102线程的紧要规则。

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

 

线程池线程都现在台线程。线程池通过提供三个由系统一管理理的利用程序线程池使你选取线程更有功效。利用为种种职责成立1个新线程的线程池的优点是线程创立和销毁的开销是可忽略的,它能够推动越来越好的习性和越来越好的系统牢固。

三、四线程方案

不过,设计的保有ThreadPool线程是在多线程单元(MTA),由此不该被用来运营ArcObjects,它们是单线程单元。若要化解此主题素材,您有二种选取。三个是实现二个专用ArcObjects的线程,它被标识为STAThread并委派各样从MTA线程调用那些专用ArcObjects线程。另1种缓解方案是利用自定义的STA线程池的达成,如标志为STA线程的线程数组来运营ArcObjects。

 

3.4、同步运转线程的面世试行

固然有大多兑现二10十2线程应用程序的主意,但以下三种方案是开采者平日利用的章程。

在诸多境况下,您必须一齐实施的产出运转的线程。常常,你要等待一个或七个线程完结他们的义务,当自然标准下取得满意,三个等候线程的功率信号恢复其任务,条件如:测试是给定线否程激活和平运动行,改换线程优先级,或给予别的部分尺码。

 

在.NET中有两种方式来保管运维线程的实践。可用来扶助线程管理的关键几类如下:

叁.1、后台线程推行长事务

System.Threading.Thread;

 

System.Threading.WaitHandle;

当需求须求长工作实行工作时,在后台实施长事务是亮点的,并且同时让应用程序灵活的操作其余职责,并让分界面处于响应状态。那一操作的事例大多,如:使用FeatureCursor来重新向DataTable装载数据,实行复杂的拓扑总括并写入新的FeatureClass。为了产生那类职责,请牢记以下几点:

System.Threading.Monitor;

 

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

a.依据在孤立模型中的线程,你无法在线程之间共享ArcObjects的组件。相反,你必要思索的是,单个对象都在分级线程中,并在后台线程中,例如全数工厂急需开荒FeatureClass,创制新的FeatureClass,设置空间参考等等。

三.五、在八个线程共享三个托管类型

 

突发性你的.NET应用程序的尾巴部分数据结构将是三个如DataTable或哈希表管理的指标。这么些.NET托管对象允许你在多个线程共享数据获得,如线程和主线程渲染他们。但是,您应该咨询MSDN
Web站点以表明那点是不是是线程安全的。在繁多气象下,3个指标是线程读安全,而写并不安全。有些集合实施联合方法,它提供了三个底层集合的联手提袋装。

b.传递给线程的具有新闻必须是简约类型或托管类型的样式。

在您的目的被八个线程访问的景况下,依据MSDN关于那种情景的靶子线程安全规则,你应该得到二个独占锁。取得这么的独占锁能够做到地点所描述的共同方法,或选拔lock语句,它通过取得给定对象的并行排他锁标签一个根本块。它能够确定保障,假使另一个线程试图访问对象时,它会被卡住,直到该指标被放出(退出锁)。

 

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

c.万一在某种意况下,你要从主线程向职业线程传递ArcObjects组件,能够将目的体系化成字符串,再将字符串传递给指标线程,然后再反种类化还原到对象。例如,你能够应用XmlSerializerClass类别化对象造成字符串,如职业区间(Workspace)连接属性(IPropertySet),再将这一字符串传递给目的线程,然后在做事线程中运用XmlSerializerClass反类别化连接属性。那样,就将接连属性对象在后台再一次成立出来,从而防止了跨线程访问。

在诸多场合下,您正在使用一个后台线程来实践长期的操作,你想向用户告知进度,状态,错误或任何与该线程推行的职责相关的新闻。这能够通过立异七个应用程序的用户分界面控件来落到实处。但是,在Windows中,窗体控件绑定到1个特定的线程(平日是主线程),并且不是线程安全的。因此,你不可能不委派,从而结成,任何调用UI控件的线程来调控它的所属。该信托是经过调用Control.Invoke方法,该措施在线程上实践委托,该信托具备控件的基础窗口句柄。要注解调用者是还是不是必须调用Invoke方法,你可以行使品质Control.InvokeRequired。您必须确定保障该控件的句柄再品尝调用Control.Invoke或Control.InvokeRequired此前曾经创办。

 

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

当运营后台线程,你可见在用户分界面驾驭职分的进程。

在大多三十二线程应用程序中,你将索要从不相同线程调用AO组件。例如,你大概有三个后台线程来博取Web服务,这反过来,应该扩大新的类别到地图显示,响应改动地图,或运维的geoprocessing(gp)的工具来施行有些类型分析。

 

多少个格外广泛的情景是从1个计时器事件处理方法调用ArcObjects。计时器的Elapsed事件是在多个线程池的职务建议,那不是三个主线程。然则,它要求运用ArcObjects,这看似是索要跨单元调用。但是,那可防止止处理ArcObjects的零件,就象是AO组件是一个用户界面控件和动用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();

 

 以上是理论方面的阐释及一个自作者支付进度中的一个代码片段,希望这么些可以匡助你达成你的八线程程序。参考的素材如下:Windows
MSDN,ES奥迪Q叁I 的开垦者网址。

作为ArcObjects的开垦人士,那象征,假诺您的应用程序不被视为七个单一线程应用程序早先化的,.NET框架将为具有的ArcObjects创制叁个特种的单线程单元(STA)线程,因为他们被标志STA。这将导致对每一个从应用程序调用ArcObjects的线程切换来那么些一定的线程上来。反过来,那迫使ArcObjects组件合在一同调用,并末了以COM组件调用大概慢了约50倍。幸运的是,那可防止通过轻巧地方统一标准记首要功效为[STAThread]。

 

 

 

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

 

 

线程池线程皆现在台线程。线程池通过提供1个由系统一管理理的采取程序线程池使您利用线程更有功能。利用为种种任务创立多少个新线程的线程池的独到之处是线程创造和销毁的开垦是可忽略的,它能够带来更加好的品质和更好的种类牢固。

 

不过,设计的具备ThreadPool线程是在拾贰线程单元(MTA),因此不应该被用来运维ArcObjects,它们是单线程单元。若要化解此主题材料,您有两种接纳。贰个是促成多个专用ArcObjects的线程,它被标识为STAThread并委派各个从MTA线程调用这一个专用ArcObjects线程。另1种缓解方案是使用自定义的STA线程池的完毕,如标记为STA线程的线程数组来运转ArcObjects。

 

三.4、同步运营线程的出现实施

 

在重重情景下,您必须同步实行的面世运维的线程。经常,你要等待三个或多少个线程实现他们的天职,当自然条件下获得满意,二个等候线程的随机信号苏醒其职分,条件如:测试是给定线否程激活和周转,改变线程优先级,或给予其余部分条件。

 

在.NET中有三种办法来保管运作线程的施行。可用来扶持线程管理的根本几类如下:

 

System.Threading.Thread;

 

System.Threading.WaitHandle;

 

System.Threading.Monitor;

 

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

 

三.伍、在七个线程共享3个托管类型

 

偶然你的.NET应用程序的平底数据结构将是四个如DataTable或哈希表管理的靶子。这个.NET托管对象允许你在三个线程共享数据获得,如线程和主线程渲染他们。然则,您应该咨询MSDN
Web站点以表达那或多或少是不是是线程安全的。在无数状态下,三个对象是线程读安全,而写并不安全。有个别集合实施联合方法,它提供了3个平底集合的共同包装。

 

在你的目的被多少个线程访问的景观下,依照MSDN关于这种状态的靶子线程安全规则,你应该取得一个独占锁。取得这么的独占锁能够成功地点所描述的同台方法,或利用lock语句,它通过取得给定对象的互相排他锁标签3个第一块。它能够保险,借使另二个线程试图访问对象时,它会被打断,直到该目的被释放(退出锁)。

 

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

 

在大多数状态下,您正在使用三个后台线程来推行长时间的操作,你想向用户告知进度,状态,错误或其余与该线程实践的天职相关的新闻。那足以因而创新三个应用程序的用户分界面控件来落到实处。不过,在Windows中,窗体控件绑定到二个一定的线程(平日是主线程),并且不是线程安全的。由此,你不能够不委派,从而结成,任何调用UI控件的线程来调控它的所属。该信托是经过调用Control.Invoke方法,该措施在线程上试行委托,该信托具备控件的根基窗口句柄。要表明调用者是不是必须调用Invoke方法,你能够应用品质Control.InvokeRequired。您必须确定保证该控件的句柄再品尝调用Control.Invoke或Control.InvokeRequired此前曾经创建。

 

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

 

在多数多线程应用程序中,你将须要从差别线程调用AO组件。例如,你大概有三个后台线程来赢得Web服务,这反过来,应该增添新的种类到地图展现,响应改动地图,或运转的geoprocessing(gp)的工具来施行某个项目分析。

 

贰个相当广阔的意况是从2个计时器事件处理方法调用ArcObjects。计时器的Elapsed事件是在2个线程池的职责提出,那不是2个主线程。然则,它要求利用ArcObjects,那类似是需求跨单元调用。但是,那能够幸免处理ArcObjects的零部件,就像AO组件是1个用户分界面控件和使用Invoke来调用委派到成立ArcObjects组件的主线程中。因此,未有跨单元调用。

 

ISynchronizeInvoke接口包含的格局有Invoke,BeginInvoke,和EndInvoke。自个儿达成那几个点子可能是叁个千斤的职责。相反,你应该有你直接从System.Windows.Forms.Control承继的类如故您应有有3个帮手类,它三番肆次自小编调节件。要么选拔将提供2个简短而使得的对于调用方法的化解方案。

 

 

 

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(“提醒”, “正在处理数据…”, 拾, 0, 100);

 

 

 

          form.Show();

 

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

 

          while (!ireslt.IsCompleted)

 

          {

 

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

 

          }

 

          SomethingClassType something= del.EndInvoke(ireslt);

 

          form.Close();

 

………

 

}

 

上述是辩论方面包车型地铁阐释及一个自个儿支付进度中的一个代码片段,希望那几个能够辅助你完了你的四线程程序。参考的材质如下:Windows
MSDN,ESEvoqueI 的开拓者网址。

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

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图