问题标签 [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 投票
1 回答
934 浏览

wpf - wpf线程,线程必须是STA

我有一个带有框架的窗口(比如主窗口),其中有一个页面。页面上的按钮打开另一个窗口(比如弹出窗口)。现在我正在尝试从弹出窗口上的按钮调用主窗口中的方法。该方法必须是多线程的,我在 Windows 窗体中运行了一个类似的解决方案,但我不断得到调用线程必须是 STA,因为许多 UI 组件在 WPF 中需要这个。

页面上以模态方式打开弹窗的方法

这里 window1 是我们的主窗口。doneDeal 方法是

最后我试图在后台运行的方法

我还想从 tickes 方法的结果中填充一个 gridview,这将在后台循环和运行,但会定期返回要添加到网格的数据。我应该在进度更新事件中这样做吗?已经尝试了很多方法来围绕 wpf 中的调度程序和后台工作人员,但我无法理解 STA 公寓状态位。如果有人可以帮助我使用我的刻度方法或指出我正确的方向,我将非常感谢。

0 投票
0 回答
123 浏览

c# - 从 c# 调用进程内免注册 com servcer 时出现不一致

我在使用免注册 com 组件时遇到了奇怪的行为。这是我所拥有的:

  1. Com 组件。我不知道它是为什么线程模型设计的,因为我没有源代码,但它肯定可以在 STA 中工作。
  2. 该 com 组件的清单 (manifestA)
  3. c# application (wpf, vs2010, ui thread is sta)

以下代码用于实例化服务器:

创建服务器如下:

wpf应用程序中的代码:

因此,当我运行应用程序时,com 方法实际上是在主 STA 线程上运行并阻塞 UI。

现在,如果我在 manifestA 中设置 threadingModel="Apartment" 它不会影响任何东西。但是如果在更改线程模型后重新编译应用程序,com 服务器开始在专用线程上工作。

我搜索了很多,但找不到发生这种情况的原因。为什么 manifestA 只在编译时生效?

有任何想法吗?

谢谢

0 投票
1 回答
940 浏览

backgroundworker - 使用主窗体作为在不同线程上创建的新窗体的父窗体

我有一个运行 BackgroundWorker 线程的主窗体。在工作人员运行时,我“冻结”主窗体并等待它完成,同时显示其进度。

在其中一个场景中,工作人员可以显示一个 OpenFileDialog 供用户选择文件。我使用第三个线程来运行 OpenFileDialog 并将它的 ApartmentState 设置为 STA,因为 OpenFileDialog 需要它(如果我不这样做则抛出异常)并且工作人员 ApartmentState 是 MTA。

问题是我想将主窗体作为参数传递给 OpenFileDialog 线程,以便在调用 OpenFileDialog.ShowDialog 时可以使用它。像这样的东西:

当然, ShowDialog 抛出:

跨线程操作无效:控件“表单”是从创建它的线程以外的线程访问的。

我怎样才能以线程安全的方式做到这一点?

这样做的目的是 OpenFileDialog 将在 STA 线程中运行,同时阻止主窗体在其上显示(阻止用户单击下面的窗体,从而隐藏 OpenFileDialog)。

谢谢

0 投票
1 回答
509 浏览

asp.net - 使用 [STAOperationBehavior] 属性在 WCF 服务中获取用户信息

我有一个启用 silverlight 的 WCF 服务,其中一种方法绝对需要[STAOperationBehavior] 属性。我需要访问用户的用户详细信息(表单身份验证),但在应用 [STAOperationBehavior] 属性时 Membership.GetUser() 失败。

IE

如何在此方法中访问用户信息,或以其他方式向此方法提供用户信息?

0 投票
2 回答
3218 浏览

multithreading - 微软的公寓类比(STA,MTA):需要帮助理解它

我已经阅读了很多有关 Microsoft 的线程单元模型的信息,但我仍然在可视化它时遇到了一些麻烦。

微软使用住在公寓里的生物进行类比。因此,对于 STA,请考虑以下内容(我知道这有点傻)。

  1. 假设线程 = 人,COMObject = 细菌。人住在公寓里,细菌住在人体内。因此在 STA-Land 中,线程存在于 STA 中,而 COMObject 存在于线程中,因此为了与 COMObject 交互,必须通过在 COMObject 的线程上运行代码来实现。

  2. 假设线程 = 人,COMObject = 猫。人住在公寓里,猫和人住在公寓里。SO在STA-Land中,线程和COMObject处于同一层次。

Q1。上面哪个类比是正确的,或者如果都不正确,您将如何描述 STA?

Q2。您如何描述 MTA?

0 投票
0 回答
1634 浏览

wpf - 使用 STA Thread 或 TaskScheduler.FromCurrentSynchronizationContext() 进行并行编程

我正在编写一个使用 WPF 控件生成 XPS 文件的代码。比方说 100 页的文件。正如我们所知,由于它使用 WPF UI 元素,它必须是 STA 线程。在前端,我有一个 Web 服务,它调用类库模块中的 GenerateBook 方法,生成 100 页的 XPS 文件。以下代码部分运行良好。但是我想让它使用并行编程更快。所以我用下面的代码转换了代码,但我发现它对四核(4 CPU)机器的性能没有影响。STA线程是否不能并行运行或我做错了什么?

并行编程后

任何回应将不胜感激。

0 投票
1 回答
375 浏览

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 对象而不会出现任何问题的最佳实践是什么?

0 投票
2 回答
1256 浏览

c# - WebBrowser 控件自动化 C# 控制台应用程序测试中的内存泄漏

以下(在本文的 PS 中)测试代码会导致内存泄漏。您能否建议如何解决此内存泄漏问题?仅供参考:我正在使用 VS2010 Prof、.NET Framework 4.0、Win7 Ultimate 和 IE9。可以使用 C# 代码行激活测试代码:

谢谢你。

PS WebBrowser 控件自动化 C# 控制台应用程序测试代码:

0 投票
3 回答
19996 浏览

wpf - “调用线程必须是 STA”解决方法

我知道关于这个主题有一些关于 SO 的答案,但我无法获得任何适合我的解决方案。我正在尝试从数据模板中触发的 ICommand 打开一个新窗口。当实例化新窗口时(在“new MessageWindowP”内),以下两个都给出了上述错误:

使用 TPL/FromCurrentSynchronizationContext 更新:有效

使用 ThreadStart: 更新:不推荐,请参阅 Jon 的回答

谢谢

编辑。根据到目前为止的响应,我想指出我还在当前调度程序上尝试了 BeginInvoke,以及在原始方法中执行代码(这就是代码开始的方式)。见下文:

BeginInvoke 更新:不推荐查看 Jon 的回答

在同一个线程 更新:如果你已经在 UI 线程上工作

BeginInvoke,使用对第一个/主窗口 更新的调度程序的引用:有效

其中 GeneralManager.MainDispatcher 是对我创建的第一个窗口的 Dispatcher 的引用:

我不知所措。

0 投票
1 回答
8646 浏览

activex - 无法实例化 ActiveX 控件,因为线程位于单线程单元中。将 PC 从睡眠中唤醒后发生

我正在开发一个 VOIP 客户端(窗口形式),它在拨打或接听电话时会打开一个浏览器窗口(ExtendedWebBrowser)。通常它工作正常,但如果计算机进入睡眠模式然后唤醒程序将崩溃并出现以下错误:

我尝试在代码中设置线程,thread.SetApartmentState(ApartmentState.STA)但我得到了相同的结果。另外,我确实有[STAThread]之前的main()功能。现在我想知道它是否与计算机进入睡眠状态时线程未正确终止有关,但我不确定。我的背景是 C++ 和 DirectX,这是我工作过的第一个 Windows 窗体,因此将不胜感激。

跟进:在发现程序在工作线程而不是主线程上启动后,我能够解决这个问题。可以在此处阅读更多信息:Sleep(suspend) 和 Resuming windows form 在工作线程而不是主线程上启动程序