那多少个消除方案,中的二十四线程使用

 
关于这类难题网上搜寻会有很多消除方案,但大旨的意思都距离十分的小,差不多难点出于启用线程时调用类似剪贴板Clipboard.SetDataObject出错,笔者把自个儿的测试代码彰显下:

转自原版的书文ArcGIS Engine
中的四线程使用

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

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

美高梅开户网址 1

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

 

[STAThread]
是一种线程模型,用在先后的进口方法上(在C#和VB.NET里是Main()方法),来钦赐当前线程的ApartmentState
是STA。用在任何格局上不产生潜移默化。在aspx页面上得以采纳AspCompat =
“true”
来达到平等的效能。那个天性只在  Com  Interop  有用,如若一切是 
managed  code 
则不行。简单的传道:[STAThread]指令应用程序的默许线程模型是单线程单元
(STA)。运转线程模型可设置为单线程单元或二10拾2线程单元。假设未对其实行安装,则该线程不被起初化。也等于说假使您用的.NET
Framework,并且未有行使COM
Interop,一般不供给那个Attribute。其余的还有MTA(二10二十四线程套间)、Free 
Thread(自由线程)。

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

       
大家都精晓到ArcGIS中处理大数据量时进度是一点也不慢,那时借使你的先后是单线程的,那可就令人干着急坏了,不知道处理到什么样程度,无法操作其余的效益,无奈~~假使在此刻你能够想到用四线程技术,那就来试试看该怎样成功吗。

     
我们都打听到ArcGIS中拍卖大数据量时进度是一定的慢,那时倘若您的主次是单线程的,那可就令人着急坏了,不知道处理到什么地步,不可能操作别的的效果,无奈~~假使在那时候你可见想到用十二线程技术,那就来尝试该怎么形成吗。

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

那多少个消除方案,中的二十四线程使用。  出现的由来:

      
首先,你得多少VS的10二线程经验或学习经历,得知道哪些拾2线程,代理(Delegate)是怎么样,同步与异步又是怎样,等等。那些在VS的补助文书档案中都有详尽表达,在此处笔者就不越职代理了。我们个中精神去了然ArcGIS中多线程吧。

 

COM 线程模型只适用于选拔 COM interop
的应用程序。借使将此属性应用到不选择 COM interop
的应用程序,将未有别的成效。

*  单元是进程之中有着同样线程访问供给的靶子的逻辑容器。同一单元中的全数指标都可以吸收接纳从该单元中的任何线程发出的调用。
.NET Framework
不行使单元,托管对象自个儿担当以线程安全的办法利用全部共享财富。由于 COM
类使用单元,由此公共语言运转
库须求在 COM interop 的动静下调用 COM
对象时创制并开端化一个单元。托管线程能够创设并进入只允许有几个线程的单线程单
元 (STA) 或许隐含3个或多个线程的10二线程单元 (MTA)。通过将线程的
ApartmentState 属性设置为 ApartmentState 枚举值之壹
,能够决定所创制的单元的花色。由于给定线程只好起头化 COM
单元一遍,因而在第3次调用非托管代码之后就无法改变单元类型。*

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

   
首先,你得稍微VS的拾二线程经验或上学经验,得清楚什么样二十多线程,代理(Delegate)是怎么,同步与异步又是怎么着,等等。那些在VS的提携文书档案中都有详细解释,在此间笔者就不多管闲事了。大家中间精神去领略ArcGIS中拾贰线程吧。

COM 线程模型可安装为单线程单元或二10拾2线程单元。假使应用程序线程实际调用了
COM 组件,则仅为 COM interop 起头化该线程。如若未有应用 COM
interop,则不初叶化该线程。

注:在互联网上找了两篇小说恐怕更能印证那几个题材。文章的不经意是,由于诸多COM在.NET环境下假设运用八线程的话,会招致引用的COM无法健康运作,
而假使不注解程序为STAThread的话,.NET就会活动使用多线程来进步效能,这样就会促成不可预感的结局。

       一、曾几何时使用八线程

 

以下是找到的一个材质介绍:
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 !

在创建八线程应用程序是应留神两点:线程的安全性和线程的伸缩性。线程安全对于持有的目的都是尤其重大的,可是仅仅只无线程安全的靶子并不意味着成功创设10贰线程应用程序,只怕说线程安全能够增强应用程序的质量。

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

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

.NET框架允许你在应用程序中可见赶快的创办线程,可是,在编写ArcObjects代码的二十多线程必须要小心。ArcObjects最根本的布局是组件对象模型(COM)。从那一点来说,编写ArcObjects的102线程的代码要求既驾驭.NET拾二线程,又要询问COM十二线程模型。

 

A.

十二线程并不总是使您的程序跑的火速,在数不胜数场所下,它还会扩大开销和复杂,那几个最后会减速程序的执行进度。当扩充的复杂性是值得的,那么多线程才能运用。贰个宗旨的条件是,借使1个职务能够分解为差别的独门职责时,那这些职务是符合拾二线程的。

      1、哪一天使用二十拾2线程

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都限制在贰个线程中,不过COM并不限定每一个进度中STA的数据。当三个措施调用进入二个STA,它被更换成STA的绝无仅有线程。因而,在STA中的3个目的将三次只收取和拍卖叁个方法调用,它接受的每一个方法调用会到达同一线程。

在创造多线程应用程序是应小心两点:线程的安全性和线程的紧缩性。线程安全对于具有的靶子都是10分关键的,不过只是唯有线程安全的指标并不意味成功开创拾贰线程应用程序,或然说线程安全能够抓好应用程序的特性。

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
玖.X中单个对象都被规划为线程唯一,而非进度唯一。在经过中管理多少个目标的能源消耗当先由抑制跨线程通信所获得的本性提上升幅度度。

.NET框架允许你在应用程序中可以赶快的创始线程,可是,在编写ArcObjects代码的10二线程必须求小心。ArcObjects最根本的组织是组件对象模型(COM)。从那一点来说,编写ArcObjects的多线程的代码必要既掌握.NET四线程,又要精通COM多线程模型。

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

对此扩展ArcGIS系统的开发者,全数目的竟然包含你成立的对象都不能够不遵照这一平整,孤立线程工作。假使你创设的靶子做为开发的一有个别,你无法不保障它们是线程唯一,而不是进度唯1。线程唯壹就是谨防跨线程通信,那里ArcGIS
Engine中二十四线程的主要规则。

 

**sta thread并不注脚应用软件的种类,和应用程序不搭界,恰相反,二个应用程序能够有八个线程.每一个线程也能够有多少个零部件或对象.在此以前win1四人系统的组件线程情势才真的是单线程.那是一种被淘汰了的格局.
线程格局用于拍卖组件在十二线程的环境里并行与并互的格局.比如套间线程(STAThread)方式中接口跨线程传递必须被调度(马尔斯hal),不调度直传肯定会战败!而MTA或FreeThread格局中的接口能够不经调度直接传递.
那种调度在一定的条件中特别影响属性(可有几百倍之差).如VB里只帮衬STAThread格局.FreeThread格局的零部件会在里边表现成和跨进度一样慢!
线程形式是微软的COM基础中的极其主要的概念.一定要了如指掌!
自小编对.net真是蒙昧(没空去弄,对不起微软二零一八年的奖赏).但本人可以肯定,C#中的[STAThread]品质是应用程序的套间伊始化代码.能够一贯领悟成SDK里的
CoInitialize(NULL); 
起来叁个STA套间实际上是约等于开了二个音信窗口,全部调用经此窗口进程调度到零部件内.
同理[MTAThread](不知有未有那几个天性,自已去查)
能够清楚成
CoInitializeEx(NULL,COINIT_MULTITHREADED )
那平常是一个对初入com大门的人来说,有早晚难度但必须过的一道关.

三、八线程方案

二10二十四线程并不总是使您的主次跑的长足,在许多情况下,它还会增多费用和错综复杂,这一个最终会减速程序的施行进程。当增添的纷纷是值得的,那么三十二线程才能动用。3个主旨的规格是,假诺一个职责能够分解为差别的独立任务时,那那么些职务是吻合二十三十二线程的。

固然有无数贯彻102线程应用程序的法门,但以下三种方案是开发者平时采用的章程。

 

3.壹、后台线程执行长事务

二、ArcObjects线程模型

当须要要求长工作进行工作时,在后台执行长事务是可取的,并且同时让应用程序灵活的操作其余职分,并让界面处于响应状态。那一操作的例证很多,如:使用FeatureCursor来再一次向DataTable装载数据,实行复杂的拓扑计算并写入新的FeatureClass。为了形成那类职务,请记住以下几点:

 

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

怀有的ArcObjects组件都被标记为单线程单元(STA参考VS扶助文档)。各种STA都限制在四个线程中,可是COM并不限定每一个进程中STA的多少。当2个措施调用进入二个STA,它被转换来STA的唯一线程。由此,在STA中的二个指标将贰回只接到和处理1个情势调用,它接受的各种方法调用会到达同壹线程。

b.传递给线程的享有新闻务必是简简单单类型或托管类型的样式。

 

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

ArcObjects组件是线程安全的,开发者可把她们在10二线程环境下采纳。对于AO应用程序在三十二线程环境下有效运营,由AO所使用的线程单元模型,即独立线程,必须加以思量。该模型的工作原理是割除跨线程通讯。一个线程内具备ArcObjects对象的引用应当只与在同1个线程的对象开始展览通讯。

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

 

三.2、实施单机ArcObjects的应用程序

对于此模型的周转,在ArcGIS
玖.X中单个对象都被设计为线程唯一,而非进度唯一。在进度中管理八个目的的能源消耗超越由抑制跨线程通讯所获得的习性提上升幅度度。

正如微软开发人士互连网(MSDN)网址上所说,“在.NET
Framework版本贰.0中,要是线程的单元状态在运转前未有规定,新的线程就开头化为ApartmentState.MTA。主应用程序线程默许起头化为ApartmentState.MTA。您不能够因而设置代码的第2行Thread.ApartmentState属性再设置主应用程序线程到ApartmentState.STA。而应利用STAThreadAttribute代替。”

 

用作ArcObjects的开发人士,那意味着,假诺你的应用程序不被视为三个单一线程应用程序开首化的,.NET框架将为具备的ArcObjects创设3个独特的单线程单元(STA)线程,因为她俩被标记STA。那将造成对每3个从应用程序调用ArcObjects的线程切换来那么些一定的线程上来。反过来,那迫使ArcObjects组件合在1起调用,并最终以COM组件调用大概慢了约50倍。幸运的是,那可防止通过简单地方统一标准记重要职能为[STAThread]。

对于扩大ArcGIS系统的开发者,全体目的竟是席卷你创立的指标都不可能不依据这一条条框框,孤立线程工作。假若您创设的对象做为开发的壹有个别,你必须保障它们是线程唯1,而不是经过唯1。线程唯1正是幸免跨线程通讯,那里ArcGIS
Engine中八线程的机要规则。

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

 

线程池线程都以往台线程。线程池通过提供二个由系统一管理理的使用程序线程池使您使用线程更有成效。利用为各种任务创建二个新线程的线程池的帮助和益处是线程成立和销毁的开销是可忽略的,它可以推动更加好的习性和更加好的种类稳定。

3、八线程方案

不过,设计的有所ThreadPool线程是在十2线程单元(MTA),由此不应当被用来运转ArcObjects,它们是单线程单元。若要消除此难点,您有两种选用。1个是落到实处一个专用ArcObjects的线程,它被标记为STAThread并委派每一个从MTA线程调用那几个专用ArcObjects线程。另壹种缓解方案是采用自定义的STA线程池的贯彻,如标记为STA线程的线程数组来运转ArcObjects。

 

3.四、同步运维线程的产出执行

就算有广大贯彻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,设置空间参考等等。

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

 

有时候你的.NET应用程序的平底数据结构将是一个如DataTable或哈希表管理的对象。这一个.NET托管对象允许你在多少个线程共享数据获得,如线程和主线程渲染他们。可是,您应该咨询MSDN
Web站点以验证那或多或少是或不是是线程安全的。在众多状态下,一个对象是线程读安全,而写并不安全。有些集合实施联合方法,它提供了2个尾巴部分集合的联合包装。

b.传递给线程的装有音讯必须是大致类型或托管类型的款型。

在你的目的被多少个线程访问的气象下,依照MSDN关于那种气象的对象线程安全规则,你应当赢得二个独占锁。取得这么的独占锁能够一挥而就地点所讲述的同步方法,或采纳lock语句,它经过取得给定对象的交互排他锁标签一个重要块。它能够确定保障,借使另一个线程试图访问对象时,它会被堵塞,直到该对象被释放(退出锁)。

 

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

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

在多数气象下,您正在利用一个后台线程来执行长期的操作,你想向用户告知进程,状态,错误或其余与该线程执行的天职相关的新闻。那足以由此创新三个应用程序的用户界面控件来促成。然而,在Windows中,窗体控件绑定到3个一定的线程(平常是主线程),并且不是线程安全的。由此,你不可能不委派,从而构成,任何调用UI控件的线程来支配它的所属。该信托是经过调用Control.Invoke方法,该办法在线程上执行委托,该信托具备控件的基础窗口句柄。要表达调用者是或不是必须调用Invoke方法,你能够运用性质Control.InvokeRequired。您必须确定保证该控件的句柄再尝试调用Control.Invoke或Control.InvokeRequired从前已经创办。

 

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

当运转后台线程,你可见在用户界面掌握职分的进程。

在许多二十四线程应用程序中,你将必要从不相同线程调用AO组件。例如,你大概有一个后台线程来获取Web服务,那反过来,应该扩张新的类别到地图显示,响应更改地图,或运营的geoprocessing(gp)的工具来实行有个别品种分析。

 

1个尤其广阔的图景是从三个计时器事件处理方法调用ArcObjects。计时器的Elapsed事件是在三个线程池的职务提出,那不是贰个主线程。可是,它必要利用ArcObjects,那就像是须求跨单元调用。然则,那足以幸免处理ArcObjects的零件,就恍如AO组件是二个用户界面控件和利用Invoke来调用委派到创建ArcObjects组件的主线程中。由此,未有跨单元调用。

3.二、实施单机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卡宴I 的开发者网址。

作为ArcObjects的开发人士,这代表,若是您的应用程序不被视为一个单一线程应用程序早先化的,.NET框架将为富有的ArcObjects成立三个破例的单线程单元(STA)线程,因为她们被标记STA。这将促成对每叁个从应用程序调用ArcObjects的线程切换来这几个一定的线程上来。反过来,那迫使ArcObjects组件合在壹起调用,并最后以COM组件调用大概慢了约50倍。幸运的是,那可制止通过不难地方统一标准记首要作用为[STAThread]。

 

 

 

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

 

 

线程池线程皆未来台线程。线程池通过提供四个由系统一管理理的采纳程序线程池使你选拔线程更有功能。利用为各样职务创制3个新线程的线程池的长处是线程成立和销毁的花费是可忽略的,它能够带动越来越好的属性和更好的连串稳定。

 

只是,设计的具备ThreadPool线程是在四线程单元(MTA),因而不该被用来运营ArcObjects,它们是单线程单元。若要解决此题材,您有三种选取。1个是落到实处一个专用ArcObjects的线程,它被标记为STAThread并委派每一种从MTA线程调用那一个专用ArcObjects线程。另壹种缓解方案是使用自定义的STA线程池的完毕,如标记为STA线程的线程数组来运行ArcObjects。

 

三.四、同步运转线程的产出执行

 

在很多动静下,您必须一起施行的产出运营的线程。通常,你要等待贰个或八个线程达成他们的职务,当自然标准下取得满意,多个守候线程的信号恢复生机其任务,条件如:测试是给定线否程激活和运作,改变线程优先级,或予以任何1些规范。

 

在.NET中有二种方式来管理运作线程的实践。可用来支援线程管理的机要几类如下:

 

System.Threading.Thread;

 

System.Threading.WaitHandle;

 

System.Threading.Monitor;

 

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

 

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

 

有时候你的.NET应用程序的底层数据结构将是3个如DataTable或哈希表管理的对象。那一个.NET托管对象允许你在七个线程共享数据获得,如线程和主线程渲染他们。不过,您应该咨询MSDN
Web站点以阐明那或多或少是不是是线程安全的。在众多状态下,四个对象是线程读安全,而写并不安全。有些集合实施联合方法,它提供了一个底部集合的联公文包装。

 

在您的指标被几个线程访问的地方下,依照MSDN关于那种处境的靶子线程安全规则,你应该获得一个独占锁。取得这么的独占锁能够做到地点所讲述的联合方法,或接纳lock语句,它经过获取给定对象的相互排他锁标签一个主要块。它可以确认保障,假设另贰个线程试图访问对象时,它会被封堵,直到该对象被放出(退出锁)。

 

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

 

在超过一全场馆下,您正在使用3个后台线程来执行长期的操作,你想向用户告知进程,状态,错误或其它与该线程执行的职责相关的音讯。那可以透过创新二个应用程序的用户界面控件来落到实处。可是,在Windows中,窗体控件绑定到2个一定的线程(平时是主线程),并且不是线程安全的。由此,你不能不委派,从而组合,任何调用UI控件的线程来决定它的所属。该信托是由此调用Control.Invoke方法,该格局在线程上举行委托,该信托具备控件的功底窗口句柄。要证实调用者是还是不是必须调用Invoke方法,你能够动用性质Control.InvokeRequired。您必须确认保障该控件的句柄再尝试调用Control.Invoke或Control.InvokeRequired以前曾经创办。

 

3.七、从2个线程调用ArcObjects而不是主线程

 

在许多十二线程应用程序中,你将索要从不同线程调用AO组件。例如,你大概有四个后台线程来赢得Web服务,那反过来,应该扩充新的门类到地图显示,响应更改地图,或运维的geoprocessing(gp)的工具来举行有个别项目分析。

 

2个要命广泛的状态是从3个计时器事件处理方法调用ArcObjects。计时器的Elapsed事件是在二个线程池的天职建议,这不是三个主线程。可是,它供给选用ArcObjects,那看似是须要跨单元调用。不过,那能够制止处理ArcObjects的机件,就象是AO组件是三个用户界面控件和应用Invoke来调用委派到开创ArcObjects组件的主线程中。由此,未有跨单元调用。

 

美高梅开户网址,ISynchronizeInvoke接口包涵的点子有Invoke,BeginInvoke,和EndInvoke。本身完成那个艺术恐怕是三个勤奋的职责。相反,你应有有您一向从System.Windows.Forms.Control继承的类依然您应当有1个帮手类,它继续自小编控制件。要么选用将提供二个简单易行而卓有作用的对于调用方法的消除方案。

 

 

 

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, 十0);

 

 

 

          form.Show();

 

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

 

          while (!ireslt.IsCompleted)

 

          {

 

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

 

          }

 

          SomethingClassType something= del.EndInvoke(ireslt);

 

          form.Close();

 

………

 

}

 

上述是辩论方面包车型客车论述及多个本人支付进度中的三个代码片段,希望这么些能够协理你成功你的三十二线程程序。参考的资料如下:Windows
MSDN,ESRAV4I 的开发者网址。

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

发表评论

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

网站地图xml地图