Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单线程公寓与多线程公寓_C#_.net_Multithreading_Apartments - Fatal编程技术网

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打印作业之前,您不必担心。(每个人说的“简单”的方式)然后什么都不起作用。