问题标签 [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.
.net - 这种情况下需要STA消息循环吗?
我有一些在 .NET 应用程序的线程上创建和运行的 COM 对象。线程被标记为单线程公寓,一切似乎都在工作。我的理解是,如果这些线程尝试从主线程访问 COM 对象,那么这些对象将在 .NET 中自动为我编组和序列化,因此即使在这种情况下,事情也会为我处理,一切安全整洁,尽管可能有点慢。
我的问题是,虽然事情似乎运行良好,但我并没有在我正在创建的 STA 线程中发送消息循环。如果可以的话,我宁愿避免消息循环,因为它会导致额外的复杂性(以及可能的效率损失)。
我已经阅读了很多关于为什么需要消息循环的建议(主要来自非常有帮助的 Hans Passant),我的理解是消息循环在线程 A 上提供了一个位置,其他线程 B 可以请求 COM 对象生活在线程 A 上可以被编组和播放。如果这是正确的,那么只要没有其他线程从线程 A 上的 COM 对象请求任何内容,线程 A 在不发送消息循环时是否安全?还是在其他情况下消息循环也可能发挥作用?
我在这里玩火吗?有没有这样的情况,你问你是不是在玩火,而你不是?
c# - 为什么 STAThread 属性被忽略?
vs 奇怪的行为……
大家好!
谁能解释一下,怎么可能?
谢谢,亚历克斯。
c# - 调用线程必须是 STA,因为很多 UI 组件都需要这个 WPF
我正在使用WPF Toolkit提供的 MessageBox 。我得到了错误
调用线程必须是 STA,因为很多 UI 组件都需要这个
在这种情况下如何设置 ApartmentState
编辑:我正在尝试使用 WPF Toolkit 的 MessageBox 控件显示无模式的 MessageBox。到目前为止,我拥有的代码如下:
c# - 在 STA 线程中使用对象后如何使用它?
我正在做一个带有 VSTO 的 Microsft PowerPoint 插件解决方案,它从硬件读取信息,硬件开发人员给了我他们的 SDK 来控制这个硬件,但我在尝试控制它时遇到了问题。
我有这个图书馆
ARS
有一堂课
ARS.BaseConnection
我有这个变量
ARS.BaseConnection BaseConn;
问题是当我创建一个类型的新对象时BaseConnection
调试器没有显示任何异常,POWERPNT.exe 只是崩溃并停止。
我试图调试 POWERPNT,它说访问冲突写入位置 0x00d20f78。但我不是在编程 PowerPoint。
我发现SDK中的演示程序(实际工作)在main之前有一个[STAThread],所以我认为它必须作为STA运行所以我创建了一个新线程:
我得到的COM 对象已与其底层 RCW 分离,无法使用。
我怎样才能使它起作用?
c# - WebBrowser 在 BackgroundWorker 理解内的 STAThread 内导航
我正在努力寻找一个好的标题,因为我已经解决了我的问题。我只需要解释我是如何解决它的……因为我正在研究我今天刚刚发现的东西,现在对我来说可能还不清楚。
因此,为了恢复我的问题解决,这里是我解决问题的方式,以及我不明白的地方。
我正在设计一个爬入网站以检索一些数据的 WindowsForm 应用程序。我有几个不同的网站要爬入,每个网站都不同。我使用的基本方式是使用 WebRequest。然而,一个网站迫使我模拟点击,所以对于这个特定的网站,我使用 WebBrowser 控件来调用特定的 javascript 函数。
我决定从主线程中退出一些爬行工作,因为这非常耗时并且冻结了我的应用程序。
我以前这样做的方法是每个搜索方法的 BackgroundWorker(每个网站一个)。它适用于每个网站,除了带有 WebBrowser 的网站。我遇到了一个异常:“无法获取 'WebBrowser' 控件的窗口句柄。不支持无窗口 ActiveX 控件。”。
我在网上发现我无法使用 WebBrowser 控件,因为我不在构建 WebBrowser 的线程中。我决定在 BackgroundWorker 的 DoWork 方法中创建一个包含 WebBrowser 的 Form,而不是原来的 Form,并为此 WebBrowser 调用 Navigate() 方法。
它也没有工作,同样的例外。我找到了这个答案(http://stackoverflow.com/questions/4269800/webbrowser-control-in-a-new-thread)这对我有很大帮助(我改变了一点答案代码让它像这是面向问题的)
所以现在:
我单击一个按钮,它会创建一个 BackgroundWorker。在 BackgroundWorker 内部,调用了 launchSearch 方法。在这个 launchSearch 方法中,我创建了一个新线程,它正在完成我需要的所有工作(这个线程的创建方式与我上面链接的解决方案几乎相同),我将“hasActiveThread”布尔值设置为 true,而线程尚未完成工作。工作完成后,我得到结果并释放我的 BackgroundWorker。
困扰我的是,我真的不明白为什么在我的 BackgroundWorker“DoWork”方法中创建表单在尝试导航到 url 时无法正常工作。如果您至少可以帮助我理解为什么解决方案必须如此“复杂”,以及这背后的原因,我将非常感激!
Al_th
wpf - 使用 BackgroundWorker 创建新的用户控件失败
我环顾了谷歌,因为我的程序在尝试加载 gif 并同时加载用户控件时会滞后,因此我需要多线程。相反,gif 挂起,页面突然显示我的用户控件,没有任何过渡。好的程序应该如何表现,
显示 gif-->加载用户控件-->隐藏 Gif-->运行动画(一个简单的幻灯片效果)
但是由于渲染用户控件的ui元素时的滞后,程序的行为是这样的
显示 Gif --> Gif 挂起(或冻结) --> 立即显示用户控件
所以我发现了这个叫做 BackgroundWorker 的东西。听起来很棒。嗯……不完全。我试了一下并将其应用到我的代码中
听起来不错。跑了。失败的。它给了我这个错误
调用线程必须是 STA,因为许多 UI 组件都需要这个。
所以再次上网研究后,我找不到任何使用该类加载用户控件的场景。所以我转向社区寻求帮助....帮助?
c# - 带有 COM 互操作的 WPF 视频渲染应用程序中的 OutOfMemory 异常
我们有一个使用 WPF/C#.Net 4.0 开发的富客户端应用程序,它与内部 COM DLL 互操作。通过这个包含视频数据的 COM 接口引发常规事件。
作为应用程序的一部分,我们通过 Windows Media Foundation 渲染视频,并创建了互操作以使用 Window Media Foundation。我们有多个 WMF 管道同时渲染不同的视频。
该应用程序运行 6-8 小时渲染视频。在此期间,私有字节始终保持稳定(例如大约 500-600MB)。
在某些时候应用程序似乎挂起,此时私有字节非常迅速地增加,直到进程消耗大约 1.4GB 的内存并因 OutOfMemoryException 而崩溃。
我们已经在 5 个不同的工作站上重现了这一点,它们具有不同的图形卡(NVIDIA 和 ATI 卡)以及 Windows 7 32 和 64 位的混合版本。
我们分析了 3 个转储文件,发现终结器线程正在等待对 ole32.GetToSTA() 方法的调用。我们无法确定导致终结器线程阻塞的原因以及如何解决此问题。我粘贴了我们一直在分析的三个转储的摘录:
转储 1)
线程 2:ae0 正在等待 STA 线程 efc
线程 28:efc 正在调用 WaitForSingleObject。它正在等待的句柄实际上是一个线程句柄 5ab4 是线程 id 14a4
线程 130:14a4 具有以下堆栈:
转储2)
STA线程:
终结器线程正在尝试切换到 STA:
转储3)
终结器线程在 GetToSTA 调用中,因此它正在等待释放 COM 对象
线程 29 是 STA 中的 COM 对象,它正在等待线程 53 (1bf4) 拥有的临界区
线程 53 正在做:
关于我们如何解决这个问题的任何想法?
wcf - AccessViolationException 和故障模块:是什么导致了这个异常?是模块故障吗?
如果发生 AccessViolationException,与它相关的故障模块是否意味着它是该模块中的错误,在我们的例子中,它恰好是我们的第三方 DLL 之一?或者这是一个更复杂的问题?我们已经联系了这个模块的制造商,但他们没有发现任何错误,只是暗示可能的堆栈损坏意味着什么。但是,根据事件日志,特定的故障模块始终与 AccessViolationException 相关联。那么这件事的真相是什么?它是有问题的第三方 DLL 模块还是其他什么?
背景
我们在 IIS 7 上运行的 .NET WCF Web 服务中使用受互斥体保护的 VB6 STA COM 对象。最近我们检测到随机 System.AccessViolationException 错误(由该对象引起)使 Web 服务完全崩溃,我们非常无助此刻,我们已经完成了使该 COM 对象与 Web 服务一起工作的所有工作。服务本身已使用以下指南设置为在 STA 模式下运行:(http://scottseely.com/2009/07/17/calling-an-sta-com-object-from-a-wcf-operation/
谢谢
wpf - wpf中的STA线程
ListViewItem 有问题。当我在线程中使用它时,它会显示一条消息:
“调用线程必须是 STA,因为很多 UI 组件都需要这个。”
然后我将其更改为:
虽然当我使用它时,它再次显示一条消息:
“调用线程无法访问此对象,因为不同的线程拥有它。”
我使用 Dispatcher。它再次显示一条消息:
“调用线程无法访问此对象,因为不同的线程拥有它。”
我在做什么来解决问题?