问题标签 [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.
multithreading - 关于线程、COM+ 和 STA 单元的几个问题
我有一个 Windows 服务,它创建 10 个线程 + 一个创建任务列表的线程。
这 11 个线程中的每一个都通过调用 CoInitialize(nil) 进入 STA。
- 任务列表由一个线程创建,另一个线程获取项目,处理它并释放....
a) 其他线程可以使用其他线程创建的对象吗?(这似乎可行,但是..) b)另一个线程可以释放另一个线程分配的内存吗?(这似乎不起作用......)
我应该以某种方式编组线程之间的指针吗?或者我是否应该至少获得该项目,对其进行处理,但让它成为创建它的线程的“所有者”?
- 在我的 Windows 服务中,我创建了可用于启动/停止服务(暂停和恢复线程)的功能。
但是,我对实际收集数据并在间隔内执行的线程有疑问。当线程加载要处理的项目后,它进入睡眠状态 5 分钟。我怎样才能安全地终止这样的线程?如何中止睡眠状态?
在此先感谢您的帮助!
multithreading - STA线程中的阻塞调用(等待,com调用)
我有一个创建 10 多个线程的 Windows 服务:
- 做他们的工作,然后进入 WaitForMultipleObjects 状态,直到他们再次恢复..
- 每个线程在其 AppServer 上创建 TDCOMConnection 组件调用方法,然后关闭连接
该服务运行良好,但是我看到了内存泄漏问题。
我只是好奇这个问题是否与消息泵有关。
我一直认为只有在我使用 com 编组时才应该在 STA 线程中应用消息泵送(在我在两个线程之间有代理的情况下)
但是今天我在某处读到,如果阻止呼叫,我应该处理消息。真的吗?
但是我的应用程序仍然可以正常运行,不会阻止自己...
也许我应该使用:CoWaitForMultipleHandles 而不是:WaitForMultipleObjects?
对这个问题有什么想法吗?
c# - windowapplication 中的 STA 线程
我的项目中有一些代码,如下所示,STA线程的用途是什么?我对 STA 的了解是它是单线程单元,仅在使用 COM 组件时才需要。它用于应用程序的主条目。
wpf - WPF:如何将数据从另一个域编组到用户控件
我必须使用另一个应用程序域中的功能。结果应显示在用户控件中。
我有类似的东西:
我不得不将 [Serializable] 属性放到 WpfUserControll 类上并实现序列化构造函数以及 ISerializable 接口,但现在我收到异常:
从 UserControl() 构造函数中引发
我该怎么做才能避免这种情况?先感谢您 !
===============================
解决方案
正如@Al 所注意到的,当涉及到跨应用程序域调用时,我的用户控件必须被序列化。现在我通过代理,它实现了 ICallback 接口。代理被标记为 Serializable 属性。
代理实现应该完全不了解用户控件,因为应该尝试再次反序列化用户控件实例。当我尝试通过界面从用户控件中抽象代理时,它没有帮助。当我尝试将接口传递给代理(由用户控件实现)时 - 发生了同样的异常。
最后,我用队列/信号量解耦了代理和用户控制。队列由一个工作线程监控,该线程将调用委托给用户控制
ps 这个队列应该继承自“MarshalByObjectRef”。
c# - 等待剪贴板文本更改(错误)
每次剪贴板数据更改时,我都会尝试检测。因此,我设置了一个计时器并让它不断检查Clipboard.GetText()
变化。
我正在使用以下代码:
运行时出现以下错误:
在进行 OLE 调用之前,必须将当前线程设置为单线程单元 (STA) 模式。
有谁知道为什么?
multithreading - 关于 COM 多线程和 STA/MTA 的问题
嗨,我是 COM 的初学者。我想在 STA 和 MTA 模式下测试 COM dll。我的第一个问题是:COM 对象是否可能同时支持 STA 和 MTA?
现在我想象下面的 STA 代码片段:
这段代码会起作用吗?我错过了任何基本的东西吗?我知道主线程需要一个窗口消息循环来执行来自其他线程的调用。我必须对此做些什么吗?
现在我继续测试 MTA。如果我只是在上面的代码中将“STA”替换为“MTA”,它会起作用吗?</p>
另一个问题是:作为带有 GUI 的线程必须是 STA,我不能在 GUI 线程中初始化和测试 MTA?
在此先感谢并为我对 COM 和线程的幼稚感到抱歉。
com - STA COM 对象的阻塞方法是设计缺陷吗?
假设在 STA 线程上创建了一个 COM 对象。所以对这个对象的所有调用都在这个线程中序列化。因此,如果对象的某个方法被阻塞,则所有使用该对象的线程都会被阻塞。
那么在 STA COM 对象中使用阻塞方法是要避免的设计缺陷吗?
如果 COM 对象是自由线程的,那么有阻塞方法可以吗?
谢谢
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。
我被困住了。任何帮助,将不胜感激。
c# - 如何在不同的线程上收听此事件?
我制作了一个小测试程序,尝试让 USB 读卡器使用制造商提供的 ActiveX 控件工作。
只要不使用单独的线程,表单就可以正常工作。我创建了一个新实例Reader
并收听该Read
事件,一切正常。我刷卡,事件触发并且文本框得到更新。
阅读器类以防万一:
但是,我需要在单独的线程上运行它。所以我将构造函数更改为
它必须是一个 STA 线程,否则 ActiveX 控件会抱怨它不能被实例化。但是这样做,事件不再触发。我对线程的工作原理不太熟悉,所以我不确定为什么。
有任何想法吗?请注意,它必须以这种方式工作(单独的线程,连接到 Read 事件),因为代码最终将驻留在类库中,该类库与我无法更改的应用程序一起部署。
.net - 有没有办法以编程方式将 ApartmentState 设置为 STA?
我正在 PowerShell 中的 GUI 上工作,当单击某些组合框时我会抛出错误。
抛出错误后,我可以放下组合框列表并查看其内容,但如果我转移到同一个 datagridview 上的另一个组合框,我会在看到下拉列表之前得到相同的初始错误。
我在 TechNet PowerShell 论坛上发布了这个,并得到了我需要在单线程单元 (STA) 中运行我的 GUI 的答案。默认情况下,PowerShell 在 MTA 中运行,但您可以-STA
在调用powershell.exe
.
但是,我的 GUI 只是调用默认的 PowerShell 应用程序(在 MTA 模式下),所以我的问题是,有没有办法从我的 GUI/脚本内部以编程方式设置公寓状态?
如果没有,我的下一个尝试将是检测公寓状态并尝试从我的 gui 的初始加载中重新启动我的 GUI,例如:
编辑:
所以我的解决方法确实有效: