问题标签 [sta]

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 投票
2 回答
961 浏览

multithreading - 关于线程、COM+ 和 STA 单元的几个问题

我有一个 Windows 服务,它创建 10 个线程 + 一个创建任务列表的线程。

这 11 个线程中的每一个都通过调用 CoInitialize(nil) 进入 STA。

  1. 任务列表由一个线程创建,另一个线程获取项目,处理它并释放....

a) 其他线程可以使用其他线程创建的对象吗?(这似乎可行,但是..) b)另一个线程可以释放另一个线程分配的内存吗?(这似乎不起作用......)

我应该以某种方式编组线程之间的指针吗?或者我是否应该至少获得该项目,对其进行处理,但让它成为创建它的线程的“所有者”?

  1. 在我的 Windows 服务中,我创建了可用于启动/停止服务(暂停和恢复线程)的功能。

但是,我对实际收集数据并在间隔内执行的线程有疑问。当线程加载要处理的项目后,它进入睡眠状态 5 分钟。我怎样才能安全地终止这样的线程?如何中止睡眠状态?

在此先感谢您的帮助!

0 投票
1 回答
462 浏览

multithreading - STA线程中的阻塞调用(等待,com调用)

我有一个创建 10 多个线程的 Windows 服务:

  • 做他们的工作,然后进入 WaitForMultipleObjects 状态,直到他们再次恢复..
  • 每个线程在其 AppServer 上创建 TDCOMConnection 组件调用方法,然后关闭连接

该服务运行良好,但是我看到了内存泄漏问题。

我只是好奇这个问题是否与消息泵有关。

我一直认为只有在我使用 com 编组时才应该在 STA 线程中应用消息泵送(在我在两个线程之间有代理的情况下)

但是今天我在某处读到,如果阻止呼叫,我应该处理消息。真的吗?

但是我的应用程序仍然可以正常运行,不会阻止自己...

也许我应该使用:CoWaitForMultipleHandles 而不是:WaitForMultipleObjects?

对这个问题有什么想法吗?

0 投票
1 回答
548 浏览

c# - windowapplication 中的 STA 线程

我的项目中有一些代码,如下所示,STA线程的用途是什么?我对 STA 的了解是它是单线程单元,仅在使用 COM 组件时才需要。它用于应用程序的主条目。

0 投票
1 回答
501 浏览

wpf - WPF:如何将数据从另一个域编组到用户控件

我必须使用另一个应用程序域中的功能。结果应显示在用户控件中。

我有类似的东西:

我不得不将 [Serializable] 属性放到 WpfUserControll 类上并实现序列化构造函数以及 ISerializable 接口,但现在我收到异常:

从 UserControl() 构造函数中引发

我该怎么做才能避免这种情况?先感谢您 !

===============================

解决方案

正如@Al 所注意到的,当涉及到跨应用程序域调用时,我的用户控件必须被序列化。现在我通过代理,它实现了 ICallback 接口。代理被标记为 Serializable 属性。

代理实现应该完全不了解用户控件,因为应该尝试再次反序列化用户控件实例。当我尝试通过界面从用户控件中抽象代理时,它没有帮助。当我尝试将接口传递给代理(由用户控件实现)时 - 发生了同样的异常。

最后,我用队列/信号量解耦了代理和用户控制。队列由一个工作线程监控,该线程将调用委托给用户控制

ps 这个队列应该继承自“MarshalByObjectRef”。

0 投票
5 回答
1561 浏览

c# - 等待剪贴板文本更改(错误)

每次剪贴板数据更改时,我都会尝试检测。因此,我设置了一个计时器并让它不断检查Clipboard.GetText()变化。

我正在使用以下代码:

运行时出现以下错误:

在进行 OLE 调用之前,必须将当前线程设置为单线程单元 (STA) 模式。

有谁知道为什么?

0 投票
2 回答
1932 浏览

multithreading - 关于 COM 多线程和 STA/MTA 的问题

嗨,我是 COM 的初学者。我想在 STA 和 MTA 模式下测试 COM dll。我的第一个问题是:COM 对象是否可能同时支持 STA 和 MTA?

现在我想象下面的 STA 代码片段:

这段代码会起作用吗?我错过了任何基本的东西吗?我知道主线程需要一个窗口消息循环来执行来自其他线程的调用。我必须对此做些什么吗?

现在我继续测试 MTA。如果我只是在上面的代码中将“STA”替换为“MTA”,它会起作用吗?</p>

另一个问题是:作为带有 GUI 的线程必须是 STA,我不能在 GUI 线程中初始化和测试 MTA?

在此先感谢并为我对 COM 和线程的幼稚感到抱歉。

0 投票
1 回答
169 浏览

com - STA COM 对象的阻塞方法是设计缺陷吗?

假设在 STA 线程上创建了一个 COM 对象。所以对这个对象的所有调用都在这个线程中序列化。因此,如果对象的某个方法被阻塞,则所有使用该对象的线程都会被阻塞。

那么在 STA COM 对象中使用阻塞方法是要避免的设计缺陷吗?

如果 COM 对象是自由线程的,那么有阻塞方法可以吗?

谢谢

0 投票
1 回答
1152 浏览

c# - 无法在单元测试中设置 WinForms 剪贴板

我想用 NUnit 测试中的文本填充 Forms.Clipboard。

我遇到的第一个问题是剪贴板必须在 STA 模式下使用。我找到了在方法上设置 RequiresSTA 属性的解决方案(NUnit 2.5.x+)。

接下来我在调用 Clipboard.SetText() 时得到一个 ExternalException。我找到使用 Clipboard.SetDataObject(object, bool, int, int) 的解决方案,您可以在其中指定 retryTimes 以多次尝试设置剪贴板。这种 hacky 解决方案有时会起作用,这显然不够好(增加 retryTimes 参数当然也会增加成功的机会)。

其他人(例如Peter)已经成功了,所以这可能与我的环境有关:我在 Windows 7 64 位目标 .NET 3.5 和 x86 下运行 VS2010。NUnit 版本是 2.5.9。

我被困住了。任何帮助,将不胜感激。

0 投票
1 回答
2243 浏览

c# - 如何在不同的线程上收听此事件?

我制作了一个小测试程序,尝试让 USB 读卡器使用制造商提供的 ActiveX 控件工作。

只要不使用单独的线程,表单就可以正常工作。我创建了一个新实例Reader并收听该Read事件,一切正常。我刷卡,事件触发并且文本框得到更新。

阅读器类以防万一:

但是,我需要在单独的线程上运行它。所以我将构造函数更改为

它必须是一个 STA 线程,否则 ActiveX 控件会抱怨它不能被实例化。但是这样做,事件不再触发。我对线程的工作原理不太熟悉,所以我不确定为什么。

有任何想法吗?请注意,它必须以这种方式工作(单独的线程,连接到 Read 事件),因为代码最终将驻留在类库中,该类库与我无法更改的应用程序一起部署。

0 投票
2 回答
3523 浏览

.net - 有没有办法以编程方式将 ApartmentState 设置为 STA?

我正在 PowerShell 中的 GUI 上工作,当单击某些组合框时我会抛出错误。

抛出错误后,我可以放下组合框列表并查看其内容,但如果我转移到同一个 datagridview 上的另一个组合框,我会在看到下拉列表之前得到相同的初始错误。

我在 TechNet PowerShell 论坛上发布了这个,并得到了我需要在单线程单元 (STA) 中运行我的 GUI 的答案。默认情况下,PowerShell 在 MTA 中运行,但您可以-STA在调用powershell.exe.

但是,我的 GUI 只是调用默认的 PowerShell 应用程序(在 MTA 模式下),所以我的问题是,有没有办法从我的 GUI/脚本内部以编程方式设置公寓状态?

如果没有,我的下一个尝试将是检测公寓状态并尝试从我的 gui 的初始加载中重新启动我的 GUI,例如:

编辑:

所以我的解决方法确实有效: