C# 单线程公寓与多线程公寓
可能重复:C# 单线程公寓与多线程公寓,c#,.net,multithreading,apartments,C#,.net,Multithreading,Apartments,可能重复: 所有线程池线程都位于 多线程单元 --根据MSDN 这是什么意思?我真的很关心多线程和单线程公寓模型之间的区别。或者公寓模式意味着什么?我读过上面的MSDN,它对我来说真的没有意义。我想我可能有一个想法,但我想这里有人可以用简单的英语解释 谢谢, 安东尼D 更新1 找到这个 有人能更详细地描述吗 更新2 我也在寻找一个关于这如何应用于线程池的答案,以及我需要注意的问题。除非您正在进行COM互操作,否则您不必担心它,在这种情况下会出现编组问题。它对.net本身没有任何影响。如果您的
所有线程池线程都位于 多线程单元 --根据MSDN 这是什么意思?我真的很关心多线程和单线程公寓模型之间的区别。或者公寓模式意味着什么?我读过上面的MSDN,它对我来说真的没有意义。我想我可能有一个想法,但我想这里有人可以用简单的英语解释 谢谢, 安东尼D 更新1 找到这个 有人能更详细地描述吗 更新2
我也在寻找一个关于这如何应用于线程池的答案,以及我需要注意的问题。除非您正在进行COM互操作,否则您不必担心它,在这种情况下会出现编组问题。它对.net本身没有任何影响。如果您的COM对象需要相信它位于单线程环境中,请使用STA。您可以保证创建和所有调用将由同一线程进行。您可以安全地使用线程本地存储,而不需要使用关键部分
如果您的COM对象可以由多个线程同时访问,请使用MTA——将不会设置任何防护装置。STA(单线程单元)和MTA(多线程单元)与此相关。COM组件可以设计为由单个线程访问,在这种情况下,COM组件托管在中,或者可以使其内部线程安全,并托管在中。一个进程只能有一个MTA,但有许多STA。如果您只打算使用COM组件,那么您真正需要知道的是,您必须将单元与组件相匹配,否则会发生不愉快的事情。正如其他人所指出的,它通常对.NET应用程序几乎没有影响
但是,请注意,用于单元测试的Microsoft测试主机实际上是在STA中实现的,这意味着您可以在单元测试中执行的操作存在限制。例如,如果您使用的是Microsoft的测试主机,则无法在单元测试中对
WaitHandle
执行WaitAll
实际上,STA和MTA对.NET代码有影响。请参阅Chris Brumme的博客,了解更多详细信息,您可能需要:
了解STA如何在.NET中传输消息非常重要。这确实有后果。我认为罗伯特·C·巴特的答案也适用于这里,对吗?“除非您正在进行COM互操作,否则您不必担心它,在这种情况下会出现编组问题。它对.net本身没有影响。”这里有几个.net特定的要点。最重要的是WinForms或WPF应用程序的主线程必须位于STA中。这是因为许多UI功能都是围绕COM实现的控件的瘦.Net包装。因此,.Net应用程序中主方法上的[STAThreadAttribute]非常完美,感谢您给出的精彩答案。我想这一切只是为了证明我在这种情况下不需要担心,不用担心。如果您使用的是.Net COM互操作,那么您在大多数情况下都不必考虑它。稍加修改,您可以有多个STA,但只能有一个MTA.Doh!很好的发现-现在修复了…仅供参考,MTA是.NET线程的默认值。好问题。我同意,没有太多直接/清晰的解释!在尝试使用WebBrowser控件从web服务发送HTML打印作业之前,您不必担心。(每个人说的“简单”的方式)然后什么都不起作用。