方式能够进行OLE调用,中的二十四线程使用

  关于那类难点网络搜索会有那七个解决方案,但宗旨的情趣都间距相当小,差不离难题出于启用线程时调用类似剪贴板Clipboard.SetDataObject出错,作者把小编的测量检验代码表现下:

转自原作ArcGIS Engine 中的十六线程使用

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

图片 1

直白都想写写AE中四线程的利用,但直接烦心未有时间,终于在八月会假日闲了下来。呵呵,闲话不说了,步向正题!

[STAThread]
是一种线程模型,用在前后相继的入口方法上(在C#和VB.NET里是Main()方法),来钦赐当前线程的ApartmentState 是STA。用在任何方法上不发出震慑。在aspx页面上可以动用AspCompat = "true" 来达到相同的效果。这么些本性只在  Com  Interop  有用,假若全勤是  managed  code  则不算。轻易的传道:[STAThread]指令应用程序的暗中同意线程模型是单线程单元 (STA)。运营线程模型可安装为单线程单元或三二十四线程单元。假使未对其张开设置,则该线程不被伊始化。也正是说倘让你用的.NET Framework,并且未有行使COM Interop,常常没有须要以此Attribute。另外的还会有MTA(八线程套间)、Free  Thread(自由线程)。

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

        我们都驾驭到ArcGIS中拍卖大数据量时进度是一定的慢,那时若是您的主次是单线程的,那可就令人发急坏了,不驾驭管理到哪些程度,无法操作其余的作用,无助~~假使在这里时你可以想到用十二线程才干,那就来试试该怎么着达成吗。

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

  出现的案由:

       首先,你得有个别VS的多线程经验或上学经验,得通晓怎么着二十十二线程,代理(Delegate)是何等,同步与异步又是何许,等等。那么些在VS的帮带文书档案中都有详实表达,在这里地自个儿就不越职代理了。我们之中精神去领会ArcGIS中二十三十二线程吧。

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

*  单元是进度之中有着同等线程访谈要求的对象的逻辑容器。同一单元中的全体目标都足以选择从该单元中的任何线程发出的调用。
.NET Framework 不应用单元,托管对象自己担当以线程安全的方法使用全体分享财富。由于 COM 类使用单元,由此公共语言运转
库须求在 COM interop 的情状下调用 COM 对象时成立并起头化一个单元。托管线程能够创设并步向只允许有多个线程的单线程单
元 (STA) 可能隐含三个或八个线程的十二线程单元 (MTA)。通过将线程的 ApartmentState 属性设置为 ApartmentState 枚举值之一
,可以调控所创办的单元的门类。由于给定线程只可以最初化 COM 单元贰次,由此在首先次调用非托管代码之后就不能够更动单元类型。*

       在ArcgIS中,大家分多少个部分演讲四线程。

COM 线程模型可安装为单线程单元或二十四线程单元。要是应用程序线程实际调用了 COM 组件,则仅为 COM interop 开始化该线程。如果未有选取 COM interop,则不起首化该线程。

注:在互连网上找了两篇作品或者更能注明那些难点。小说的大要是,由于多数COM在.NET情况下借使应用二十四线程的话,会变成援用的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 !

在创制四线程应用程序是应注意两点:线程的安全性和线程的伸缩性。线程安全对于全体的靶子都以老大重大的,可是只有只有线程安全的对象并不意味着成功开创三十二线程应用程序,也许说线程安全能够加强应用程序的品质。

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

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

A.

八线程并不总是使您的前后相继跑的敏捷,在广大情状下,它还会大增开销和复杂性,那一个最后会放缓程序的进行进程。当扩展的繁缛是值得的,那么二十四线程手艺选取。三个骨干的标准是,借使一个职责能够解释为不一致的独立职分时,那这几个职务是符合八线程的。

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的数额。当三个主意调用进入二个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组件是线程安全的,开采者可把她们在三十二线程情状下使用。对于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中单个对象都被设计为线程独一,而非进度唯一。在进程中管理多个目的的能源消耗抢先由制止跨线程通信所收获的品质提上涨的幅度度。

以下引述另一齐辈的解说:
**STA不是单线程的意思.加泰罗尼亚语为single threaded apartment.是一种套间(或译为公寓)线程形式.

对于扩大ArcGIS系统的开辟者,全部指标竟是席卷你创建的指标都必需比照这一平整,孤立线程职业。借使您创制的靶子做为开辟的一部分,你必需确定保障它们是线程独一,实际不是经过独一。线程独一正是防范跨线程通讯,这里ArcGIS Engine中十二线程的基本点准绳。

**sta thread并不申明APP的类型,和应用程序不搭界,恰相反,贰个应用程序能够有多少个线程.种种线程也足以有多个零部件或对象.早前win13人系统的机件线程形式才真正是单线程.那是一种被淘汰了的情势.
线程情势用于拍卖组件在二十四线程的遭受里并行与并互的情势.比方套间线程(STAThread)格局中接口跨线程传递必得被调治(马尔斯hal),不调治直传确定会倒闭!而MTA或FreeThread形式中的接口能够不经调整直接传递.
这种调节在特定的情形中那些影响属性(可有几百倍之差).如VB里只扶植STAThread格局.FreeThread方式的组件会在中间表现有和跨进程一样慢!
线程模式是微软的COM基础中的极度重要的概念.应当要吃透!
自个儿对.net真是古板(没空去弄,对不起微软二〇一八年的奖励).但笔者能够一定,C#中的[STAThread]天性是应用程序的套间早先化代码.能够一贯掌握成SDK里的
CoInitialize(NULL); 
初步三个STA套间实际上是一对一于开了三个消息窗口,全数调用经此窗口进程调节到零部件内.
同理[MTAThread](不知有未有其一特性,自已去查)
能够清楚成
CoInitializeEx(NULL,COINIT_MULTITHREADED )
那日常是叁个对初入com大门的人来讲,有一定难度但必得过的一道关.

3、八线程方案

就算有比很多落到实处八线程应用程序的艺术,但以下二种方案是开拓者平日应用的不二法门。

3.1、后台线程奉行长事务

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

a. 按照在孤立模型中的线程,你不能够在线程之间分享ArcObjects的零件。相反,你须求思量的是,单个对象都在各自线程中,并在后台线程中,比如全体工厂须要开垦FeatureClass,创立新的FeatureClass,设置空间参照他事他说加以考察等等。

b.传递给线程的有着消息必得是归纳类型或托管类型的款型。

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

当运营后台线程,你可以预知在顾客分界面领悟职分的进度。

3.2、奉行单机ArcObjects的应用程序

正如微软开荒职员互连网(MSDN)网站上所说,“在.NET Framework版本2.0中,如若线程的单元状态在起步前并未有鲜明,新的线程就从头化为ApartmentState.MTA。主应用程序线程暗许初叶化为ApartmentState.MTA。您不可能透过设置代码的率先行Thread.ApartmentState属性再设置主应用程序线程到ApartmentState.STA。而应运用STAThreadAttribute取代。”

用作ArcObjects的开采人士,那意味,假如你的应用程序不被视为一个单一线程应用程序领头化的,.NET框架将为保有的ArcObjects创制二个破例的单线程单元(STA)线程,因为他俩被标志STA。那将产生对每三个从应用程序调用ArcObjects的线程切换来那一个一定的线程上来。反过来,那迫使ArcObjects组件合在一齐调用,并最终以COM组件调用大概慢了约50倍。幸运的是,那可防止通过轻便地方统一标准记首要职能为[STAThread]。

3.3、使用托管线程池和BackgroundWorker的线程

线程池线程都未来台线程。线程池通过提供二个由系统管理的应用程序线程池让你利用线程更有作用。利用为每种职责创设四个新线程的线程池的长处是线程创设和销毁的支付是可忽视的,它能够带来越来越好的本性和越来越好的系统稳固。

可是,设计的有着ThreadPool线程是在二十四线程单元(MTA),由此不该被用来运营ArcObjects,它们是单线程单元。若要化解此难题,您有三种接纳。三个是落实二个专项使用ArcObjects的线程,它被标志为STAThread并委派各样从MTA线程调用这么些专项使用ArcObjects线程。另一种减轻方案是利用自定义的STA线程池的贯彻,如标志为STA线程的线程数组来运维ArcObjects。

3.4、同步运转线程的出现施行

在数不尽地方下,您必得同步试行的出现运营的线程。常常,你要等待叁个或多个线程完结他们的职责,当自然原则下猎取满意,多个等候线程的时限信号苏醒其任务,条件如:测量试验是给定线否程激活和平运动转,改动线程优先级,或授予任何一些规格。

在.NET中有两种办法来管理运转线程的施行。可用来赞助线程管理的主要几类如下:

System.Threading.Thread;

System.Threading.WaitHandle;

System.Threading.Monitor;

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

3.5、在四个线程分享二个托管类型

突发性你的.NET应用程序的尾部数据结构将是四个如DataTable或哈希表管理的目的。那些.NET托管对象允许你在几个线程分享数据得到,如线程和主线程渲染他们。不过,您应该咨询MSDN Web站点以注明那点是还是不是是线程安全的。在成千上万地方下,二个对象是线程读安全,而写并不安全。有些集结实行联合方法,它提供了贰个平底集结的共同包装。

在你的指标被多少个线程访谈的景况下,依据MSDN关于这种地方包车型大巴靶子线程安全准绳,你应该得到叁个独占锁。获得这么的独占锁能够成功地点所呈报的同台方法,或利用lock语句,它经过获得给定对象的互相排他锁标签三个关键块。它能够确认保证,即便另三个线程试图访问对象时,它会被堵塞,直到该目的被假释(退出锁)。

3.6、从后台线程更新客商分界面

在多数意况下,您正在利用一个后台线程来实践短时间的操作,你想向顾客告知进程,状态,错误或其余与该线程实行的天职相关的新闻。那足以经过创新三个应用程序的客户分界面控件来兑现。不过,在Windows中,窗体控件绑定到二个一定的线程(平时是主线程),并且不是线程安全的。因而,你必得委派,进而组合,任何调用UI控件的线程来决定它的所属。该信托是透过调用Control.Invoke方法,该方式在线程上实践委托,该信托具备控件的底蕴窗口句柄。要证实调用者是或不是必须调用Invoke方法,你能够动用性质Control.InvokeRequired。您必需确定保障该控件的句柄再尝试调用Control.Invoke或Control.InvokeRequired从前曾经创办。

3.7、从三个线程调用ArcObjects并不是主线程

在许多八线程应用程序中,你将急需从差异线程调用AO组件。举个例子,你或然有二个后台线程来赚取Web服务,那反过来,应该扩大新的品类到地图展现,响应退换地图,或运营的geoprocessing(gp)的工具来推行有些品种深入分析。

贰个不胜广阔的情事是从叁个计时器事件处理方法调用ArcObjects。电磁照拂计时器的Elapsed事件是在二个线程池的职务建议,那不是一个主线程。不过,它要求动用ArcObjects,那类似是索要跨单元调用。不过,那能够免止管理ArcObjects的组件,就仿佛AO组件是一个客户界面控件和采纳Invoke来调用委派到成立ArcObjects组件的主线程中。因而,未有跨单元调用。

ISynchronizeInvoke接口包含的主意有Invoke,BeginInvoke,和EndInvoke。自身完成那一个措施恐怕是三个辛勤的职责。相反,你应有有您直接从System.Windows.Forms.Control承袭的类依旧你应当有二个帮手类,它延续自作者调整件。要么选拔将提供三个回顾而卓有功能的对于调用方法的建设方案。

 

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汉兰达I 的开拓者网址。

 

 

 

本文由星彩网app下载发布于计算机编程,转载请注明出处:方式能够进行OLE调用,中的二十四线程使用

TAG标签: 星彩网app下载
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。