【转】C#中[STAThread]的作用

C#的关键字 [STAThread]即 single-threaded apartment
一:
每个Thread都有一个关于ApartmentState的属性,可以把它设置为:STA或者MTA,或者UNKNOWN。
当你想指定工程的启动窗口的时候,你需要在该窗口类中申明一个Main()方法,并为这个方法设置[STAThread]属性。
详细信息,清查阅MSDN中关于Threading和COM Interop和COM+ Apartment Model的文章:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguidnf/html/cpconmanagedunmanagedthreading.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguidnf/html/cpconadvancedcominterop.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cossdk/htm/pgservices_synchronization_8703.asp

二:
[STAThread]是Single  Thread  Apartment单线程套间的意思,是一种线程模型,用在程序的入口方法上
(在C#和VB.NET里是Main()方法),来指定当前线程的ApartmentState 是STA。用在其他方法上不产生影响。
在aspx页面上可以使用AspCompat = "true" 来达到同样的效果。这个属性只在  Com  Interop  有用,
如果全部是  managed  code  则无用。简单的说法:[STAThread]指示应用程序的默认线程模型是单线程单元 (STA)。
启动线程模型可设置为单线程单元或多线程单元。如果未对其进行设置,则该线程不被初始化。也就是说如果你用的.NET Framework,
并且没有使用COM Interop,一般不需要这个Attribute。其它的还有MTA(多线程套间)、Free  Thread(自由线程)。
单线程套间,简单来说所有对于单线程套间中对象的访问都是通过消息来传递的,所以同一时间只有一个线程能够访问单线程套间中的对象。

三:
C#中,[STAThread]代表什么意思?如何用?
Single Thread Apartment

>Why is STAThread required?

it changes the apartment state of the current thread to be single threaded

>Single Thread Apartment vs MultiThread Apartment?

Correct: With the STAThread attribute, you will be interacting with COM processes in a
"Single Threading Apartment" model. Without it, you will be interacting with COM processes
in the "Multiple Threading Apartment" model.

> so why do I need it....or why would I want it at some point?

You may want to interact with a COM process in a MTA model for performance reasons. You may
want to interact with a COM process in a STA model because of a design requirement. For example,
to use the Windows clipboard (System.Windows.Forms.Clipboard) you must be calling from a thread
running in a STA. If the calling thread was started by your application you can set the ApartmentState
(System.Threading.ApartmentState) before starting, but if you want to use the clipboard from your a
pplication's main thread, you need to use the System.STAThread attribute on your Main method.

> why does Main( ) only function as an entry point when it is declared static?

The simple answer is that is just the way that Microsoft designed the language. One way you can look at
this though, is there should only be 1 "instance" of your Main method - the main method has nothing to do
with any specific instances of the class it is defined in, and should therefore be static. In my opinion
it might have been a good idea to give the Main method a property similar to a static contructor where it is
executed once, and only once. Anyway, because the Main method is static, you can execute your program without
having to create any arbitrary objects.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436706.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开始blog

我不是一个习惯用文字记录心情,事情的人。原因有三:1、没有毅力,小时候爱买精美的日记本,但总写几页就扔到一边了。2、从小就不爱写作文,所以文笔很差。有时翻开自己以前的日记,看了都想撕。3、字写得难看。…

【转】C#搭建Oauth2.0认证流程以及代码示例

对于一个普遍问题,必有对应的一个简洁优美的解决方案。这也许只是一厢情愿,因为根据宇宙法则,所有事物总归趋于混沌,而OAuth协议就是混沌中的产物,不管是1.0、1.0a还是2.0,单看版本号就让人神伤。 OAuth2.0…

语言差异引起的问题解决一例

在2004DevDay中,介绍的SmartClient技术以及其DataProtection技术,刚好目前的项目计划使用这样的技术。我是使用C#编码的,但IssueVission是用VB.Net写的,这难不倒我,毕竟BASIC还是自己的入门语言,VB和VBScri…

思想已经高过行动好多了

好几天过去了,依然没什么起色,今天搜索一下论坛上自己的老帖,整理出来做个见证,看着自己才开始ASP的时候问的问题,不知所云。现在就不一样了,哈哈……在听了些微软的讲座之后,对设计模式很感兴趣…

【转】自旋锁-SpinLock(.NET 4.0+)

短时间锁定的情况下,自旋锁(spinlock)更快。(因为自旋锁本质上不会让线程休眠,而是一直循环尝试对资源访问,直到可用。所以自旋锁线程被阻塞时,不进行线程上下文切换,而是空转等待。…

php实现把es6转为es5,如何将ES6代码转化为ES5?

比方说下面这段代码:const navigator window.navigatornavigator.getUserMedia navigator.getUserMedia ||navigator.webkitGetUserMedia ||navigator.mozGetUserMedia ||navigator.msGetUserMediaconst AudioContext window.AudioContext ||window.webkitAudioC…

IBM收购Rational一年总结

IBM收购Rational一年总结 Clint Boulton[2003/12/26] 12月,又到年关总结的时候了,这次,是该IBM给这个耗资2.1亿美元的交易作评价了。 这次收购帮助IBM增加了在使用面向服务架构(SOA)发布Web Service方面增加了筹码。SO…

【转】.NET 自带的动态代理+Expression 实现AOP

下面代码(摘抄之别处,原创在哪不知)是采用TransparentProxy和RealProxy实现对象的动态代理。碍于其使用反射调用方法,所以就小试着将反射改成Expression以提高执行的效率。第15行就是原来代码中反射调用方法的关键代码。 1 using …

新来乍到,谢谢大家捧场

原来的blog是:http://www.blogcn.com/user9/szujobs/index.html由hBifTs 介绍,才得知有这么一个好地方。于是昨天把原来的文章迁移过来,其中一些文章有点旧了,写了有一阵子了。我的朋友都叫温少,毕业自深圳大学&#x…

【转】谈谈c#中异步编程模型的变迁**

大家在编程过程中都会用到一些异步编程的情况。在c#的BCL中,很多api都提供了异步方法,初学者可能对各种不同异步方法的使用感到迷惑,本文主要为大家梳理一下异步方法的变迁以及如何使用异步方法。 BeginXXX,EndXXX模式 在.Net F…

nextcloud php 版本,Nextcloud版本升级教程

捷径:cd /www/wwwroot/x.timeit.cnsudo -u www php updater/updater.phar进行命令更新,并使用occ进行更新系统,并关闭维护模式:sudo -u www php occ upgradesudo -u www php occ maintenance:mode --off注意:(命令需要在nextcloud…

剖析Jive的缓存机制

剖析Jive的缓存机制- - 作者:张磊 本文选自:开放系统世界 2003年06月06日Jive是一个广受欢迎的开放源码的论坛项目,虽然推出了很多年,但至今很多Java程序员还对它津津乐道。从框架结构上看,它采用了很多设计模式&#…

php统计在线时长,js统计网站运行时长

js统计网站运行时长第一种:网站function siteTime(){window.setTimeout("siteTime()", 1000);var seconds 1000var minutes seconds * 60var hours minutes * 60var days hours * 24var years days * 365var today new Date()var todayYear today.…

【转】细说.NET中的多线程 (四 使用锁进行同步)

通过锁来实现同步 排它锁主要用来保证,在一段时间内,只有一个线程可以访问某一段代码。两种主要类型的排它锁是lock和Mutex。Lock和Mutex相比构造起来更方便,运行的也更快。但是Mutex可以在同一个机器上的不同进程使用。 Monitor.Enter和Mo…

发现很多人的基础都不好

加了一些C#的qq群,有一次提了一个很简单的问题,关于abstract class的(具体问题忘记了),很多人都搞不清楚。还有一些所谓在做项目的,只是拖些控件,做个界面(界面还挺漂亮的&#xff0…

oracle ora-22288,向oracle的blob字段导入文件

在数据库主机上创建测试目录及文件$mkdir /test$cd /test$echo "Test Subject" >> subject.html$echo "test ok !" >> mail.html定义文件路径(都是数据库主机上的),并授权$sqlplus user/passwdinstanceSQL>create or replace di…

【转】细说.NET中的多线程 (五 使用信号量进行同步)

上一节主要介绍了使用锁进行同步,本节主要介绍使用信号量进行同步 使用EventWaitHandle信号量进行同步 EventWaitHandle主要用于实现信号灯机制。信号灯主要用于通知等待的线程。主要有两种实现:AutoResetEvent和ManualResetEvent。 AutoResetEvent …

做自己喜欢的人

1)首先做一个快乐的人 什么是成功? 有钱是不是成功?地位是不是成功? 成功就是实现自己有意义的既定的目标 为自己设定阶段性的目标,如果达成这些阶段性的目标就是成功 1)工作2)学习3)家庭生活 三个方面的目…

oracle只匹配中文,Oracle 实现 一个关键字 匹配多个 字段

有这么一个需求,满足只有一个输入框的条件下,支持不同数据列的搜索结果。说白了,就是这个 输入框 既可以用来 搜索姓名,也可以搜索 年龄,地址等。分析:一般情况下,我们的一个输入框对应 数据库…

【转】细说.NET中的多线程 (六 使用MemoryBarrier,Volatile进行同步)

上一节介绍了使用信号量进行同步,本节主要介绍一些非阻塞同步的方法。本节主要介绍MemoryBarrier,volatile,Interlocked。 MemoryBarriers 本文简单的介绍一下这两个概念,假设下面的代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 …