- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
全部,
我在 C# 中使用线程有一段时间了,但我仍然对线程的单元状态的真正含义感到有点困惑。我知道 WinForms 必须始终使用 STA 公寓状态(与 MTA 相对),但我仍然不清楚公寓状态是什么。
最佳答案
COM 有非常崇高的目标。其中之一是线程是一个很难正确处理的编程细节,应该由支持库来管理。与 .NET 非常不同,在 .NET 中,以线程安全的方式使用非线程安全的类完全取决于您。
这通过注册表工作,COM coclass 发布 ThreadingModel 注册表项,说明它支持哪种线程。到目前为止,他们中的大多数人都使用“公寓”,这是一种不太明确的方式来表达“我不支持多线程”。这是 COM 确保以线程安全方式调用所有方法的信号。如果您的程序从工作线程调用方法,则 COM 负责将调用从工作线程编码到创建实例的线程。从而自动确保服务器以线程安全的方式使用。与 Control.Invoke 和 Dispatcher.Invoke 的工作方式不同,但完全是自动的。
这当然是美妙的魔法,但您的程序确实需要进行一些合作。没有您的帮助,COM 无法像那样编码调用。当您的程序创建线程时,它必须调用 CoInitialize() 来告诉 COM 基础结构您要参与 COM 调用。那时,您必须告诉它您创建的线程是什么种类。有两个,以“公寓”类型区分。有STA(单线程单元)和MTA(多线程)。 STA 线程是不支持线程的 COM 组件的好客之家。 MTA 线程不是。
不过,这种公寓是有价格标签的。创建 STA 时,您必须遵守 STA 规则。有点龙:
消息循环是 COM 将调用从一个线程编码到另一个线程的机制。需要永不阻塞规则来防止死锁。虽然是龙语,但它是程序的 UI 线程的工作方式。这不是巧合。
在 MTA 线程上创建单元线程 COM 对象也是有代价的。这样的线程不是一个好归宿,它不遵循 STA 规则。 COM 无济于事,无法对方法调用进行编码。 COM 介入并实际创建它自己的 STA 线程,为对象提供一个好客的家。很好,但并不便宜,因为这会消耗一个线程并且每个方法调用都被编码,这会为每个调用增加很多开销。
COM 线程支持非常好,它可以处理 98% 的时间,而无需执行任何特殊操作。然而,正是这 2% 会导致严重的偏头痛,您几乎无能为力。它的扩展性也很差,这可能是 .NET 没有类似功能的最大原因。
虽然 COM 可能看起来已经死了,但单元在 Windows 编程中仍然是一个非常重要的问题。 .NET 框架对它们有明确的支持。例如,在 STA 线程上调用 Thread.Join() 或 Monitor.Enter(),COM 明确禁止,使 CLR 泵成为消息循环。其他工件是您在 GUI 应用程序的 Main() 方法和 Thread.SetApartmentState() 上看到的 [STAThread] 属性,这是让 CLR 调用 CoInitialize() 的正确方法。剪贴板、拖放和外壳对话框(如 OpenFileDialog)等 GUI 功能明确要求 STA 才能工作。创建任何窗口的线程应始终是 STA 线程。
关于c# - 线程公寓状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5168815/
我很难理解进程外环境中的COM公寓。 基本上我不明白为什么客户端需要调用CoInitializeEx在公寓中注册自己的线程。 我可以理解STA或MTA中的服务器线程和服务器线程使用的对象。但是我不明白
关联(belongs_to)模型出现以下错误: PG::ForeignKeyViolation: ERROR: insert or update on table "employees" violat
我正在使用 apartment gem 和 MySQL 作为数据库在 Rails 中创建一个 Multi-Tenancy 应用程序。我在https://gorails.com/episodes/mul
我在尝试时遇到错误 bundle exec rails generate apartment:install 得到这个错误, build': undefined method new' for "Ap
我在尝试在我的 Rails 5.1 项目上设置 Gitlab CI 时遇到一个奇怪的问题,该项目使用 apartment gem 来支持 Multi-Tenancy 。我已经设置了 docker-co
我知道默认情况下,公寓会在公共(public)数据库和租户数据库上创建相同的表。而且公共(public)数据库上的大多数表都是没有用的,空表。我也知道租户数据库依赖于 schema.rb 但我想知道我
我正在使用这个 apartment ruby 。 我在 application.rb 文件中添加了这个: config.middleware.use 'Apartment::Elevators::Su
在执行 rake db:migrate 时,出现此错误: Migrating alpha tenant One of the following schema(s) is invalid: "alph
根据 railscast,我当前的设置是一个 Multi-Tenancy 应用程序 389-multitenancy-with-postgresql 我正在尝试将设置移动到使用 apartment g
我正在使用 heroku 和 Rails 构建一个 SAAS 平台。为此,我使用 apartment gem 管理租户。 在我的本地开发中这没有问题,但是当我尝试使用到 heroku 时出现下一个错误
我是一名优秀的程序员,十分优秀!