威尼斯人线上娱乐

中的八线程使用,情势能够举行OLE调用

7 4月 , 2019  

 
关于那类难题网上检索会有那1个消除方案,但主题的意思都距离相当的小,大约难点出于启用线程时调用类似剪贴板Clipboard.SetDataObject出错,小编把自己的测试代码展现下:

转自原来的书文ArcGIS Engine
中的十二线程使用

直白都想写写AE中八线程的利用,但平素烦心未有时间,终于在月夕日假期期闲了下去。呵呵,闲话不说了,进入正题!

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

威尼斯人线上娱乐 1

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

 

[STAThread]
是一种线程模型,用在程序的输入方法上(在C#和VB.NET里是Main()方法),来内定当前线程的ApartmentState
是STA。用在别的办法上不发出震慑。在aspx页面上能够使用AspCompat =
“true”
来达到相同的功用。那些性情只在  Com  Interop  有用,如若一切是 
managed  code 
则不算。简单的布道:[STAThread]指令应用程序的暗中同意线程模型是单线程单元
(STA)。运维线程模型可设置为单线程单元或二十多线程单元。就算未对其展开设置,则该线程不被起首化。也正是说假使您用的.NET
Framework,并且未有利用COM
Interop,1般不供给以此Attribute。别的的还有MTA(多线程套间)、Free 
Thread(自由线程)。

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

       
大家都打听到ArcGIS中拍卖大数据量时进程是一定的慢,那时假诺你的程序是单线程的,那可就令人焦急坏了,不知晓处理到什么样地步,不能够操作其余的功效,无奈~~倘诺在那儿你可知想到用拾二线程技术,那就来尝试该怎么实现吗。

     
我们都询问到ArcGIS中处理大数据量时进程是壹对一的慢,那时假如你的次序是单线程的,那可就令人焦急坏了,不精晓处理到如何程度,不可能操作其余的效劳,无奈~~假使在那时候你能够想到用二10四线程技术,那就来试试该怎么样成功吗。

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

  出现的缘故:

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

 

COM 线程模型只适用于选拔 COM interop
的应用程序。假若将此属性应用到不应用 COM interop
的应用程序,将从未别的功效。

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

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

   
首先,你得多少VS的10贰线程经验或学习经历,得清楚如何三十六线程,代理(Delegate)是怎么着,同步与异步又是何等,等等。这么些在VS的帮忙文书档案中都有详尽分解,在此处小编就不越职代理了。我们在那之中精神去通晓ArcGIS中四线程吧。

COM 线程模型可设置为单线程单元或二10三十二线程单元。如若应用程序线程实际调用了
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 !

在创建多线程应用程序是应注意两点:线程的安全性和线程的紧缩性。线程安全对于有所的指标都以尤其首要的,不过壹味只无线程安全的对象并不代表成功创办四线程应用程序,大概说线程安全能够增长应用程序的性质。

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

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

.NET框架允许你在应用程序中能够火速的创办线程,然而,在编写ArcObjects代码的拾二线程必需要小心。ArcObjects最根本的组织是组件对象模型(COM)。从这一点来说,编写ArcObjects的十2线程的代码需求既领会.NET多线程,又要精通COM二10102线程模型。

 

A.

十贰线程并不再而三使你的顺序跑的敏捷,在很多动静下,它还会增多支出和错综复杂,这一个最终会减慢程序的履行进程。当增加的复杂是值得的,那么四线程才能选用。四个主导的规则是,假使二个职责能够表明为差别的独自职务时,那那一个职分是顺应多线程的。

      一、哪天使用二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.

二、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中的多个对象将贰遍只接受和处理2个办法调用,它接受的种种方法调用会到达同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对象的引用应当只与在同2个线程的对象实行通讯。

 

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中单个对象都被设计为线程唯1,而非进程唯一。在进程中管理多个指标的能源消耗超越由抑制跨线程通讯所获取的属性提上升幅度度。

.NET框架允许你在应用程序中可见高效的创制线程,可是,在编写ArcObjects代码的10二线程必须要小心。ArcObjects最根本的构造是组件对象模型(COM)。从这一点来说,编写ArcObjects的二十四线程的代码须要既了然.NET拾二线程,又要打听COM八线程模型。

以下引述另一同辈的发言:
中的八线程使用,情势能够举行OLE调用。**STA不是单线程的意思.英文为single threaded apartment.是1种套间(或译为公寓)线程格局.

对此扩充ArcGIS系统的开发者,全部指标竟是席卷你成立的目的都必须依据这一条条框框,孤立线程工作。假若您成立的对象做为开发的一有的,你无法不确定保障它们是线程唯1,而不是经过唯一。线程唯1便是严防跨线程通讯,这里ArcGIS
Engine中八线程的主要性规则。

 

**sta thread并不评释APP的品类,和应用程序不搭界,恰相反,3个应用程序能够有多个线程.每一种线程也得以有七个零件或对象.从前win16人系统的零件线程情势才真的是单线程.那是1种被淘汰了的形式.
线程方式用于拍卖组件在二十多线程的环境里并行与并互的格局.比如套间线程(STAThread)形式中接口跨线程传递必须被调度(Marshal),不调度直传肯定会破产!而MTA或FreeThread情势中的接口能够不经调度直接传递.
那种调度在一定的环境中非常影响属性(可有几百倍之差).如VB里只援救STAThread形式.FreeThread格局的组件会在里头表现成和跨进度1样慢!
线程格局是微软的COM基础中的极其首要的概念.一定要吃透!
本身对.net真是古板(没空去弄,对不起微软二零一八年的褒奖).但自小编能够肯定,C#中的[STAThread]脾气是应用程序的套间早先化代码.能够一贯精通成SDK里的
CoInitialize(NULL); 
开始一个STA套间实际上是一定于开了2个音讯窗口,全体调用经此窗口进程调度到零部件内.
同理[MTAThread](不知有未有其1个性,自已去查)
能够领略成
CoInitializeEx(NULL,COINIT_MULTITHREADED )
那日常是多个对初入com大门的人的话,有早晚难度但不可能可是的壹道关.

叁、四线程方案

10二线程并不两次三番使你的次序跑的高速,在广大景况下,它还会大增开支和复杂性,那些最终会减慢程序的履行进程。当扩展的错综复杂是值得的,那么二十八线程才能运用。一个中坚的尺度是,假若三个义务能够表明为分裂的单身职责时,那这一个职务是符合多线程的。

就算有好多兑现二10三十二线程应用程序的艺术,但以下两种方案是开发者平时利用的不二秘诀。

 

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

二、ArcObjects线程模型

当供给须求长工作实行工作时,在后台执行长事务是优点的,并且还要让应用程序灵活的操作其余职责,并让界面处于响应状态。那一操作的事例很多,如:使用FeatureCursor来重新向DataTable装载数据,实行理并答复杂的拓扑总括并写入新的FeatureClass。为了成功那类职务,请牢记以下几点:

 

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

持有的ArcObjects组件都被标记为单线程单元(STA参考VS补助文书档案)。各样STA都限制在叁个线程中,不过COM并不限制每一种进度中STA的多少。当七个艺术调用进入三个STA,它被转换成STA的绝无仅有线程。由此,在STA中的2个对象将壹次只接收和拍卖四个办法调用,它接受的每种方法调用会到达同一线程。

b.传递给线程的拥有音信必须是简单类型或托管类型的花样。

 

c.万一在某种境况下,你要从主线程向工作线程传递ArcObjects组件,可以将对象类别化成字符串,再将字符串传递给指标线程,然后再反种类化还原到对象。例如,你能够选择XmlSerializerClass种类化对象变成字符串,如办事区间(Workspace)连接属性(IPropertySet),再将这一字符串传递给指标线程,然后在干活线程中动用XmlSerializerClass反类别化连接属性。那样,就将一而再属性对象在后台再次创造出来,从而幸免了跨线程访问。

ArcObjects组件是线程安全的,开发者可把她们在四线程环境下采用。对于AO应用程序在八线程环境下有效运维,由AO所使用的线程单元模型,即独立线程,必须加以思量。该模型的行事规律是扫除跨线程通讯。三个线程内具备ArcObjects对象的引用应当只与在同一个线程的目标举行通讯。

当运转后台线程,你能够在用户界面精晓职务的速度。

 

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

对于此模型的运作,在ArcGIS
九.X中单个对象都被设计为线程唯一,而非进度唯一。在进度中管理八个目的的财富消耗超越由抑制跨线程通讯所获取的属性提上升幅度度。

正如微软开发人士互联网(MSDN)网址上所说,“在.NET
Framework版本二.0中,假设线程的单元状态在起步前从未有过分明,新的线程就从头化为ApartmentState.MTA。主应用程序线程暗中认可开端化为ApartmentState.MTA。您不可能由此设置代码的首先行Thread.ApartmentState属性再设置主应用程序线程到ApartmentState.STA。而应运用STAThreadAttribute代替。”

 

用作ArcObjects的开发人士,那表示,假设你的应用程序不被视为三个单一线程应用程序初叶化的,.NET框架将为具备的ArcObjects制造二个卓殊的单线程单元(STA)线程,因为她俩被标记STA。那将造成对每二个从应用程序调用ArcObjects的线程切换成那些一定的线程上来。反过来,那迫使ArcObjects组件合在一起调用,并最终以COM组件调用恐怕慢了约50倍。幸运的是,那可幸免通过简单地方统一标准记主要职能为[STAThread]。

对于扩展ArcGIS系统的开发者,全体指标竟然席卷你创建的对象都不可能不根据这壹平整,孤立线程工作。要是您创建的靶子做为开发的一局地,你必须保障它们是线程唯一,而不是进程唯1。线程唯一正是防止跨线程通信,那里ArcGIS
Engine中八线程的基本点规则。

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

 

线程池线程都是往台线程。线程池通过提供五个由系统管理的应用程序线程池使您选拔线程更有功用。利用为种种职分创制1个新线程的线程池的独到之处是线程成立和销毁的支出是可忽略的,它能够拉动更加好的属性和越来越好的体系稳定。

三、八线程方案

可是,设计的富有ThreadPool线程是在十2线程单元(MTA),因而不应当被用来运维ArcObjects,它们是单线程单元。若要化解此难题,您有三种选择。3个是实现三个专用ArcObjects的线程,它被标记为STAThread并委派各样从MTA线程调用那一个专用ArcObjects线程。另壹种缓解方案是接纳自定义的STA线程池的落到实处,如标记为STA线程的线程数组来运营ArcObjects。

 

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

尽管有广大贯彻八线程应用程序的方法,但以下二种方案是开发者常常选用的法子。

在众多状态下,您必须一起施行的产出运转的线程。平时,你要等待贰个或八个线程完毕他们的职务,当自然标准下取得知足,叁个等候线程的随机信号苏醒其任务,条件如:测试是给定线否程激活和平运动行,改变线程优先级,或给予其余部分尺度。

 

在.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,设置空间参考等等。

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

 

偶尔你的.NET应用程序的平底数据结构将是1个如DataTable或哈希表管理的靶子。那么些.NET托管对象允许你在多少个线程共享数据得到,如线程和主线程渲染他们。不过,您应该咨询MSDN
Web站点以表明那或多或少是不是是线程安全的。在很多动静下,1个对象是线程读安全,而写并不安全。某些集合实施联合方法,它提供了多少个平底集合的一只包装。

b.传递给线程的具备音信务必是简约类型或托管类型的格局。

在您的目的被八个线程访问的气象下,根据MSDN关于那种气象的靶子线程安全规则,你应该赢得2个独占锁。取得这么的独占锁可以做到地点所讲述的联合方法,或采用lock语句,它经过获取给定对象的交互排他锁标签三个重要块。它能够确定保障,假若另三个线程试图访问对象时,它会被堵塞,直到该对象被放出(退出锁)。

 

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

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

在多数景况下,您正在利用二个后台线程来执行长期的操作,你想向用户告知进程,状态,错误或其余与该线程执行的任务相关的消息。那能够通过立异3个应用程序的用户界面控件来贯彻。不过,在Windows中,窗体控件绑定到三个特定的线程(平常是主线程),并且不是线程安全的。由此,你不能够不委派,从而构成,任何调用UI控件的线程来控制它的所属。该信托是经过调用Control.Invoke方法,该措施在线程上执行委托,该信托具备控件的根基窗口句柄。要表达调用者是还是不是必须调用Invoke方法,你能够运用性质Control.InvokeRequired。您必须确定保证该控件的句柄再尝试调用Control.Invoke或Control.InvokeRequired在此之前早已创办。

 

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

当运营后台线程,你能够在用户界面理解职分的快慢。

在许多二十四线程应用程序中,你将供给从分裂线程调用AO组件。例如,你可能有贰个后台线程来获取Web服务,那反过来,应该扩大新的品类到地图展现,响应更改地图,或运维的geoprocessing(gp)的工具来施行有个别品种分析。

 

多个非凡广阔的图景是从三个计时器事件处理方法调用ArcObjects。计时器的Elapsed事件是在三个线程池的职分建议,这不是2个主线程。可是,它须求动用ArcObjects,那就好像是亟需跨单元调用。可是,这足以幸免处理ArcObjects的组件,就接近AO组件是二个用户界面控件和采取Invoke来调用委派到成立ArcObjects组件的主线程中。因而,未有跨单元调用。

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

威尼斯人线上娱乐 ,ISynchronizeInvoke接口包罗的方法有Invoke,BeginInvoke,和EndInvoke。本人完结那几个办法可能是一个千斤的职责。相反,你应该有你直接从System.Windows.Forms.Control继承的类照旧您应当有1个帮手类,它继续自笔者控制件。要么采用将提供二个简练而使得的对于调用方法的消除方案。

 

 

正如微软开发人士互联网(MSDN)网址上所说,“在.NET
Framework版本2.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();

 

 以上是辩论方面包车型客车演讲及三个本身支付进度中的二个代码片段,希望这么些能够援救您做到你的二十10二线程程序。参考的资料如下:Windows
MSDN,ESHavalI 的开发者网址。

用作ArcObjects的开发职员,那意味,倘使您的应用程序不被视为3个单1线程应用程序初步化的,.NET框架将为具备的ArcObjects创造二个与众不一致的单线程单元(STA)线程,因为他俩被标记STA。那将促成对每三个从应用程序调用ArcObjects的线程切换成那么些一定的线程上来。反过来,这迫使ArcObjects组件合在1起调用,并最后以COM组件调用或者慢了约50倍。幸运的是,那可制止通过不难地方统一标准记重要功能为[STAThread]。

 

 

 

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

 

 

线程池线程皆现在台线程。线程池通过提供3个由系统一管理理的施用程序线程池使你利用线程更有效能。利用为每一种任务创制三个新线程的线程池的帮助和益处是线程创设和销毁的支付是可忽略的,它能够带来更加好的性质和更加好的系统稳定。

 

然而,设计的全数ThreadPool线程是在102线程单元(MTA),由此不该被用来运维ArcObjects,它们是单线程单元。若要解决此题材,您有三种选用。1个是实现3个专用ArcObjects的线程,它被标记为STAThread并委派各个从MTA线程调用这一个专用ArcObjects线程。另一种缓解方案是应用自定义的STA线程池的达成,如标记为STA线程的线程数组来运转ArcObjects。

 

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

 

在不少景色下,您必须联合执行的出现运转的线程。经常,你要等待2个或多个线程完结他们的任务,当自然原则下获得知足,2个守候线程的非确定性信号恢复生机其职分,条件如:测试是给定线否程激活和平运动作,改变线程优先级,或予以任何1些尺度。

 

在.NET中有两种方式来保管运作线程的实行。可用来救助线程管理的基本点几类如下:

 

System.Threading.Thread;

 

System.Threading.WaitHandle;

 

System.Threading.Monitor;

 

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

 

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

 

偶尔你的.NET应用程序的底层数据结构将是二个如DataTable或哈希表管理的靶子。这么些.NET托管对象允许你在七个线程共享数据获得,如线程和主线程渲染他们。不过,您应该咨询MSDN
Web站点以证实那或多或少是或不是是线程安全的。在很多动静下,贰个对象是线程读安全,而写并不安全。有个别集合实施联合方法,它提供了二个平底集合的壹块包装。

 

在您的对象被多少个线程访问的动静下,按照MSDN关于这种情状的靶子线程安全规则,你应有获得八个独占锁。取得那样的独占锁能够完结地方所描述的联合方法,或利用lock语句,它通过获取给定对象的相互排他锁标签三个主要块。它能够有限援助,固然另二个线程试图访问对象时,它会被卡住,直到该目的被放飞(退出锁)。

 

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

 

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

 

3.7、从七个线程调用ArcObjects而不是主线程

 

在许多10贰线程应用程序中,你将索要从分歧线程调用AO组件。例如,你恐怕有三个后台线程来获取Web服务,那反过来,应该增添新的品种到地图呈现,响应更改地图,或运转的geoprocessing(gp)的工具来施行有些项目分析。

 

2个可怜广泛的意况是从一个计时器事件处理方法调用ArcObjects。计时器的Elapsed事件是在3个线程池的天职提议,这不是一个主线程。但是,它须求接纳ArcObjects,那就如是急需跨单元调用。但是,那足以制止处理ArcObjects的零件,就就像AO组件是三个用户界面控件和利用Invoke来调用委派到开创ArcObjects组件的主线程中。由此,未有跨单元调用。

 

ISynchronizeInvoke接口包含的艺术有Invoke,BeginInvoke,和EndInvoke。本人完结那几个形式可能是3个千斤的任务。相反,你应有有你直接从System.Windows.Forms.Control继承的类依旧你应当有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(“提示”, “正在处理数据…”, 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();

 

………

 

}

 

以上是辩论方面包车型客车解说及二个自个儿支付进度中的1个代码片段,希望这一个能够扶助您做到你的二十八线程程序。参考的资料如下:Windows
MSDN,ESCR-VI 的开发者网址。

作品出处:http://anshien.blog.163.com/blog/static/169966308201082441114173/


相关文章

发表评论

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

网站地图xml地图