如果一个线程在Windows中必须是STA(单线程单元),那么它在Linux或MacOS中能正常工作吗?

4
最近我在升级一个库以使用.NET 6和.NET 7,发现有一些代码将公寓状态设置为STA,但我发现设置公寓状态只适用于Windows。为了让编译器满意,我们将代码更改为以下内容。
#if NET472
    _thread.SetApartmentState(ApartmentState.STA);
#else
    if (OperatingSystem.IsWindows())
        _thread.SetApartmentState(ApartmentState.STA);
#endif

但这让我想到,如果这段代码最终在Linux或MacOS平台上运行,一切会没问题吗?除了如果你有一个应该以单线程运行的线程,你应该使用STA之外,我对Windows中的单线程公寓和多线程公寓的作用几乎一无所知。我对这些概念如何转化到Linux和MacOS也几乎一无所知,是否重要也不得而知。这些操作系统是否总是表现得像STA,或者总是表现得像MTA,或者根本不重要,因为处理方式如此不同,进行比较甚至没有意义,但它仍然能够工作。
我们目前没有任何立即在Linux或MacOS上运行此库的用例,但也许将来会有,但因为这样,这个库可能会在很长一段时间内没有经过测试。
1个回答

2
我对此并不是专家,但根据ApartmentState枚举文档中的备注部分的信息,我可以做出一些推断:
.NET Framework不使用apartments,托管对象负责以线程安全的方式使用所有共享资源。
由于COM类使用apartments,当在COM互操作情况下调用COM对象时,公共语言运行时需要创建和初始化一个apartment。
这告诉我该库很可能在某种情况下使用COM互操作,因此关于它是否适用于MacOS/Linux的答案很可能是“不适用”,因为COM是Windows的东西。
但再次强调,我在这方面并不是专家,也许WINE会让我感到意外。

这对于这个库的使用是有意义的。它的主要用途之一是将本地API调用安排到严格的单线程后台线程上,而这些本地API可能使用COM对象。如果这个库在MacOS或Linux环境中被使用,那么这些本地库也需要被移植到MacOS或Linux,这意味着它们将不再使用COM对象。所以这里的限制实际上是由我们这里的库使用的本地库决定的。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接