问题标签 [apartments]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
9 回答
153613 浏览

.net - 你能解释一下STA和MTA吗?

你能用你自己的话解释一下 STA 和 MTA 吗?

另外,什么是单元线程,它们是否只与 COM 相关?如果是这样,为什么?

0 投票
1 回答
338 浏览

multithreading - 术语“输入同步调用”是什么意思?

我在一篇关于多线程公寓的文章中找到了这一点,但找不到“输入同步调用”的定义。(文章位于http://msdn.microsoft.com/en-us/library/ms693421(VS.85).aspx

如文章中所用 - 多线程公寓无法进行输入同步调用

什么是“输入同步”调用?

谢谢

0 投票
6 回答
6877 浏览

c# - WebBrowser.Navigated 仅在我 MessageBox.Show() 时触发;

我有一个 WebBrowser 控件,它是从后台 STA 线程动态实例化的,因为父线程是 BackgroundWorker 并且还有很多其他事情要做。

问题是导航事件永远不会触发,除非我在告诉它.Navigate() 的方法中弹出一个MessageBox.Show()。我将解释:

这很好用;但是由于这是一个自动化应用程序,因此消息框会妨碍您。当我删除 MessageBox.Show() 时,WebBrowser.Navigated 事件永远不会触发。我尝试用 Thread.Sleep() 代替这一行,并挂起父线程。

一旦我解决了这个问题,我打算在 WebBrowser 执行其工作时暂停父线程,并找到某种方法将生成的 HTML 传递回父线程,以便它可以继续执行进一步的逻辑。

为什么这样做?我该如何解决?

如果有人可以为我提供一种获取网页内容、填写一些数据并在提交按钮的另一侧返回页面内容的方法,所有这些都针对不支持 POST 动词也不支持的网络服务器通过 QueryString 传递数据,我也会接受这个答案,因为整个练习都是不必要的。


解决方案:在团队架构师的建议下,我最终根本没有使用 BackgroundWorker 和从属线程......虽然以牺牲响应性为代价:(

0 投票
5 回答
49600 浏览

c# - 单线程单元 vs 多线程单元

可能重复:
您能解释一下 STA 和 MTA 吗?

所有 ThreadPool 线程都在多线程单元中。

--根据 MSDN

这意味着什么?我真的很关心多线程与单线程单元模型之间的区别。或者公寓模型是什么意思?我已经阅读了关于它的 MSDN,这对我来说真的没有意义。我想我可能有一个想法,但我想这里有人可以用简单的英语解释它。

谢谢,安东尼 D

更新 1

找到这个 你能解释一下 STA 和 MTA 吗?

任何人都可以更具描述性吗?

更新 2

我也在寻找有关这如何应用于线程池的答案,以及因此我需要注意的事项。

0 投票
1 回答
1630 浏览

c# - 异步操作中的异步操作

我的多线程知识仍然很初级,所以非常感谢这里的一些指示。我有一个接口 IOperationInvoker(来自 WCF),它具有以下方法:

鉴于此接口的具体实现,我需要实现相同的接口,同时在单独的线程中调用底层实现。(如果你想知道为什么,具体的实现会调用一个需要处于不同公寓状态的遗留 COM 对象)。

目前,我正在做这样的事情:

我想我需要用我自己的方法来包装返回的 AsyncResult,这样我就可以回到我们处理的线程......但老实说,我有点超出我的深度。任何指针?

非常感谢,

詹姆士

0 投票
2 回答
1924 浏览

multithreading - 旧版 VB6 COM+ DLL 调用本机 Win32 DLL - STA 的线程问题?

遇到乍一看像 MT 问题的东西,但我试图详细了解 COM+ 使用的 STA 模型。

实际上,我有一个用 VB6 编写的遗留 COM+ 组件,它调用用 C++ 编写的本机(即非 COM)Win32 DLL。

遇到一些间歇性(并且无法在测试中重现)问题,我添加了一些调试代码以找出发生了什么,并发现当问题发生时,我在文件中交错了日志消息 - 所以它暗示 DLL被两个线程同时调用。

现在日志记录到基于 _getpid() 和 GetCurrentThreadId() 的每个线程文件,所以看起来当 C++ DLL 中的代码被调用时,它会同时在同一个线程上被调用两次。我对 STA 的理解表明,这可能是这种情况,因为 COM 将对象的各个实例编组到单个线程上,并随意挂起和恢复执行。

不幸的是,我不确定从这里去哪里。我读到我应该在 DllMain() 中调用 CoInitialiseEx() 来告诉 COM 这是一个 STA DLL,但其他地方说这仅对 COM DLL 有效,并且对本机 DLL 没有任何影响。唯一的其他选择是将 DLL 的某些部分包装为关键部分以序列化访问(承担对下巴造成的任何性能损失)。

我可以尝试重做 DLL,但没有共享状态或全局变量 - 一切都在局部变量中,所以理论上每个调用都应该有自己的堆栈,但我想知道 STA 模型是否基本上对此有一些奇怪的影响并且只是在与另一个调用相同的入口点重新进入已加载的 DLL。不幸的是,我不知道如何证明或测试这个理论。

问题基本上是:

  1. 当 STA COM+ 组件调用本机 DLL 时,STA 模型中没有任何内容可以防止活动“线程”被挂起并将控制权传递给 DLL 调用中间的另一个“线程”?
  2. CoInitialiseEx() 是否是解决此问题的正确方法?
  3. 如果 (1) 或 (2) 都不是“好的”假设,那会发生什么?
0 投票
1 回答
1596 浏览

c# - 如何使 Quartz.net 作业在单线程单元中运行?

我只是尝试了这个:

但它会产生 InvalidOperationException。想法?

0 投票
1 回答
470 浏览

asp.net - Thread.Join 在共享主机环境中

我想知道是否有人可以帮助我 - 我已经编写 VB.Net 很长时间了,但很少需要在 ASP.Net 中做很多线程。

我正在尝试使用内存浏览器对网站进行“截图”。然后将这些图像记录在数据库中并写入本地文件系统。

当我在本地服务器上运行它时,一切正常。当我在共享托管环境中运行它时,一切都很好,直到我执行 thread.join,此时目标线程立即终止或卡住(没有从任何一个线程接收到进一步的日志信息)。我附上了下面的日志

还附上了关键代码,但简而言之:

对于每个 url,启动一个新线程并 thread.join 到它。新线程将加载浏览器并开始导航。在返回生成的位图图像(下一步)之前,它会一直等待浏览器加载完成。

在浏览器加载完成时,会触发一个事件。处理程序从浏览器捕获位图图像并将其写入本地。

我做了一些谷歌搜索,但找不到很多相关信息——我发现了常见的共享托管问题,并确保我已经解决了这些问题(例如,允许部分受信任的调用者、签署程序集等......)

如果有关于这个主题的知识的人能很好地为我指出正确的方向,我将不胜感激。

非常感谢

注意:我知道目前它会非常慢,因为它是按顺序处理图像的——但是在我让它在一个线程上工作之前,我没有机会让它在多个线程上工作。

这在很大程度上是从代码示例中拼凑起来的,我什至还没有开始整理/更好地组织它,所以为稍微混乱的代码道歉。

以及我看到的日志条目:

0 投票
1 回答
307 浏览

.net - TimerCallback 委托驱动 STA 模型 .NET 库组件

我正在尝试使用 TimerCallback 委托机制在定时执行的单独线程上驱动来自第 3 方 .NET 库组件的对象实例。

当我尝试从库中创建对象的实例时,会引发异常:

(对象名)只能从单线程单元(STA)调用

作为我的应用程序入口点的 sub main 被标记为 MTAThread,如 msdn 上的 Microsoft 示例所示

0 投票
1 回答
2382 浏览

multithreading - 关于单元线程模型

我有几个关于公寓的问题:

  1. 这个模型是为了 COM 目的而引入的吗?
  2. 你能指出关于它们的好资源吗?
  3. 从线程安全的角度来看,组件支持 STA 或 MTA 模型意味着什么?

谢谢。