问题标签 [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.
wpf - wpf线程,线程必须是STA
我有一个带有框架的窗口(比如主窗口),其中有一个页面。页面上的按钮打开另一个窗口(比如弹出窗口)。现在我正在尝试从弹出窗口上的按钮调用主窗口中的方法。该方法必须是多线程的,我在 Windows 窗体中运行了一个类似的解决方案,但我不断得到调用线程必须是 STA,因为许多 UI 组件在 WPF 中需要这个。
页面上以模态方式打开弹窗的方法
这里 window1 是我们的主窗口。doneDeal 方法是
最后我试图在后台运行的方法
我还想从 tickes 方法的结果中填充一个 gridview,这将在后台循环和运行,但会定期返回要添加到网格的数据。我应该在进度更新事件中这样做吗?已经尝试了很多方法来围绕 wpf 中的调度程序和后台工作人员,但我无法理解 STA 公寓状态位。如果有人可以帮助我使用我的刻度方法或指出我正确的方向,我将非常感谢。
c# - 从 c# 调用进程内免注册 com servcer 时出现不一致
我在使用免注册 com 组件时遇到了奇怪的行为。这是我所拥有的:
- Com 组件。我不知道它是为什么线程模型设计的,因为我没有源代码,但它肯定可以在 STA 中工作。
- 该 com 组件的清单 (manifestA)
- c# application (wpf, vs2010, ui thread is sta)
以下代码用于实例化服务器:
创建服务器如下:
wpf应用程序中的代码:
因此,当我运行应用程序时,com 方法实际上是在主 STA 线程上运行并阻塞 UI。
现在,如果我在 manifestA 中设置 threadingModel="Apartment" 它不会影响任何东西。但是如果在更改线程模型后重新编译应用程序,com 服务器开始在专用线程上工作。
我搜索了很多,但找不到发生这种情况的原因。为什么 manifestA 只在编译时生效?
有任何想法吗?
谢谢
backgroundworker - 使用主窗体作为在不同线程上创建的新窗体的父窗体
我有一个运行 BackgroundWorker 线程的主窗体。在工作人员运行时,我“冻结”主窗体并等待它完成,同时显示其进度。
在其中一个场景中,工作人员可以显示一个 OpenFileDialog 供用户选择文件。我使用第三个线程来运行 OpenFileDialog 并将它的 ApartmentState 设置为 STA,因为 OpenFileDialog 需要它(如果我不这样做则抛出异常)并且工作人员 ApartmentState 是 MTA。
问题是我想将主窗体作为参数传递给 OpenFileDialog 线程,以便在调用 OpenFileDialog.ShowDialog 时可以使用它。像这样的东西:
当然, ShowDialog 抛出:
跨线程操作无效:控件“表单”是从创建它的线程以外的线程访问的。
我怎样才能以线程安全的方式做到这一点?
这样做的目的是 OpenFileDialog 将在 STA 线程中运行,同时阻止主窗体在其上显示(阻止用户单击下面的窗体,从而隐藏 OpenFileDialog)。
谢谢
asp.net - 使用 [STAOperationBehavior] 属性在 WCF 服务中获取用户信息
我有一个启用 silverlight 的 WCF 服务,其中一种方法绝对需要[STAOperationBehavior] 属性。我需要访问用户的用户详细信息(表单身份验证),但在应用 [STAOperationBehavior] 属性时 Membership.GetUser() 失败。
IE
但
如何在此方法中访问用户信息,或以其他方式向此方法提供用户信息?
multithreading - 微软的公寓类比(STA,MTA):需要帮助理解它
我已经阅读了很多有关 Microsoft 的线程单元模型的信息,但我仍然在可视化它时遇到了一些麻烦。
微软使用住在公寓里的生物进行类比。因此,对于 STA,请考虑以下内容(我知道这有点傻)。
假设线程 = 人,COMObject = 细菌。人住在公寓里,细菌住在人体内。因此在 STA-Land 中,线程存在于 STA 中,而 COMObject 存在于线程中,因此为了与 COMObject 交互,必须通过在 COMObject 的线程上运行代码来实现。
假设线程 = 人,COMObject = 猫。人住在公寓里,猫和人住在公寓里。SO在STA-Land中,线程和COMObject处于同一层次。
Q1。上面哪个类比是正确的,或者如果都不正确,您将如何描述 STA?
Q2。您如何描述 MTA?
wpf - 使用 STA Thread 或 TaskScheduler.FromCurrentSynchronizationContext() 进行并行编程
我正在编写一个使用 WPF 控件生成 XPS 文件的代码。比方说 100 页的文件。正如我们所知,由于它使用 WPF UI 元素,它必须是 STA 线程。在前端,我有一个 Web 服务,它调用类库模块中的 GenerateBook 方法,生成 100 页的 XPS 文件。以下代码部分运行良好。但是我想让它使用并行编程更快。所以我用下面的代码转换了代码,但我发现它对四核(4 CPU)机器的性能没有影响。STA线程是否不能并行运行或我做错了什么?
并行编程后
任何回应将不胜感激。
wcf - 在 WCF 服务中调用 STA Visual Basic 6.0 COM 对象的最佳实践:并发访问
我有一个调用STA Visual Basic 6.0 COM 对象的 WCF 服务。如果只有一个客户端使用该服务,一切正常,但是一旦并发用户开始调用它,我就会遇到麻烦,并且在调用 COM 对象的方法之一时遇到各种随机错误。
起初,我在Calling an STA COM Object from a WCF Operation 一文的帮助下添加了对 STAOperationBehavior 属性的支持,从而解决了这个问题。
好吧,它帮了很多忙,有一段时间一切似乎都运行良好,但现在当多个用户调用该服务时,我开始在特定服务器上收到 System.AccessViolationException 错误。
我读过这可能是一个线程问题,我应该在我的网络服务中使用互斥锁或实例上下文。
确保并发用户可以在 WCF 服务中使用 STA COM 对象而不会出现任何问题的最佳实践是什么?
c# - WebBrowser 控件自动化 C# 控制台应用程序测试中的内存泄漏
以下(在本文的 PS 中)测试代码会导致内存泄漏。您能否建议如何解决此内存泄漏问题?仅供参考:我正在使用 VS2010 Prof、.NET Framework 4.0、Win7 Ultimate 和 IE9。可以使用 C# 代码行激活测试代码:
谢谢你。
PS WebBrowser 控件自动化 C# 控制台应用程序测试代码:
wpf - “调用线程必须是 STA”解决方法
我知道关于这个主题有一些关于 SO 的答案,但我无法获得任何适合我的解决方案。我正在尝试从数据模板中触发的 ICommand 打开一个新窗口。当实例化新窗口时(在“new MessageWindowP”内),以下两个都给出了上述错误:
使用 TPL/FromCurrentSynchronizationContext 更新:有效
使用 ThreadStart: 更新:不推荐,请参阅 Jon 的回答
谢谢
编辑。根据到目前为止的响应,我想指出我还在当前调度程序上尝试了 BeginInvoke,以及在原始方法中执行代码(这就是代码开始的方式)。见下文:
BeginInvoke 更新:不推荐查看 Jon 的回答
在同一个线程 更新:如果你已经在 UI 线程上工作
BeginInvoke,使用对第一个/主窗口 更新的调度程序的引用:有效
其中 GeneralManager.MainDispatcher 是对我创建的第一个窗口的 Dispatcher 的引用:
我不知所措。
activex - 无法实例化 ActiveX 控件,因为线程位于单线程单元中。将 PC 从睡眠中唤醒后发生
我正在开发一个 VOIP 客户端(窗口形式),它在拨打或接听电话时会打开一个浏览器窗口(ExtendedWebBrowser)。通常它工作正常,但如果计算机进入睡眠模式然后唤醒程序将崩溃并出现以下错误:
我尝试在代码中设置线程,thread.SetApartmentState(ApartmentState.STA)
但我得到了相同的结果。另外,我确实有[STAThread]
之前的main()
功能。现在我想知道它是否与计算机进入睡眠状态时线程未正确终止有关,但我不确定。我的背景是 C++ 和 DirectX,这是我工作过的第一个 Windows 窗体,因此将不胜感激。
跟进:在发现程序在工作线程而不是主线程上启动后,我能够解决这个问题。可以在此处阅读更多信息:Sleep(suspend) 和 Resuming windows form 在工作线程而不是主线程上启动程序