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

c# - 调用线程必须是 STA,因为许多 UI 组件在 WPF 中都需要此错误。在 form.show()

首先,我已经阅读了网站上类似问题的几个答案,但老实说,我发现它们有点令人困惑(由于我缺乏经验而不是答案!)。我正在使用 FileSystemWatcher() 类来监视文件夹以查找正在创建/更改的文件。一旦事件发生,我想在项目中加载另一个表单。当新表单上的构造函数尝试执行时,我没有加载表单,而是收到错误消息。我只使用一个线程 - 我没有尝试在不同的线程下加载表单。我的代码如下

希望您能提供帮助,非常感谢。

0 投票
2 回答
2853 浏览

c# - 不能使用属于与其父 Freezable 不同的线程的 DependencyObject - prism

我在开发 WPF 应用程序时遇到了一个问题。该应用程序基于棱镜。应用程序使用 prism 引导程序启动,在加载任何窗口之前,应用程序在不同的线程 (STA) 上打开一个模式对话框,然后加载一堆东西(服务等)。该对话框在此期间打开并允许通知用户应用程序启动过程的进度(使用事件聚合器传递更新)。加载完成后,引导程序关闭对话框并打开主应用程序窗口。 到目前为止,一切都很好... 然后在关闭应用程序时,同样的事情正在发生。关闭主窗口,打开一个对话框(再次在新的 STA 线程上),以允许通知。但是现在,当点击 ShowDialog 调用(发生在新的 STA 线程内)时,会引发异常:“不能使用属于与其父 Freezable 不同的线程的 DependencyObject”。经过长时间的调试,我发现异常的原因是窗口的背景,它是从应用程序级别的合并字典中获取的画笔/图像(在 wpf UI 线程上实例化)。如果在没有 ResouceDictionary 的情况下加载图像 - 一切顺利。


总结: 只有在使用 resourceDictionary 并且仅在第二次调用新的 STA 线程时才会观察到异常,该线程反过来加载 DialogBox 并在调用 ShowDialog 时准确地引发异常 如果您只有一个对话框(例如,在启动时间并且仅在关机过程中出现对话框),则不会发生异常。


我的问题是:这是什么原因?在这种情况下,这个例外到底意味着什么?(我知道通常会有某种 UI 线程更新来自其他线程,但是我不明白为什么这只发生在 dialgo+thread 的第二个实例上)。

谢谢 :)

0 投票
1 回答
1212 浏览

c# - 从 COM/STA 线程向 WPF UI 线程报告进度

我正在开发一个使用 COM 和 Acrobat SDK 打印 PDF 的应用程序。该应用程序是用 C#、WPF 编写的,我试图弄清楚如何在单独的线程上正确运行打印。我已经看到 BackgroundWorker 使用线程池,因此不能设置为 STA。我确实知道如何创建 STA 线程,但不确定如何从 STA 线程报告进度:

如何在这样创建的 STA 线程中向我的 WPF ViewModel 报告进度?

0 投票
2 回答
9030 浏览

c# - SetApartmentState 和 [STAThread]

在 Watin 的源代码中,有一段代码:

既然创建的线程有它的单元状态集,为什么[STAThread]要在方法中添加属性呢?我对特定的代码不感兴趣,但我想知道是否STAThread需要属性。

笔记:

  • 该方法GoToNoWaitInternal未在其他地方使用。
  • 整个 watin 项目是关于操作 WebBrowser 对象(通常是 Internet Explorer 窗口)。因此,我们正在操作一个 COM 对象。
0 投票
1 回答
406 浏览

c# - BackgroundWorker 可以加入(链接到、访问、调用、成为)STAThread

我不太熟悉 STAThread 的确切作用(是),所以我不确定我的问题是否正确陈述。

我有一个在 BackgroundWorker 线程中运行的进程,它将 Excel 范围的内容复制到剪贴板 ( Excel.Range.Copy())。复制后,我需要能够访问剪贴板内容以将它们写入文本文件,但显然剪贴板无法直接从我的 BackgroundWorker 访问(当我尝试Clipboard.GetText()从我的 BackgroundWorker 使用并将该文本写入我的文本文件时,没有文本传递,即使我可以在单独的文本文件上手动执行 Ctrl-V 并粘贴刚刚通过 C# 进程从 Excel 范围复制的内容)。

我还应该提到,我在 BackgroundWorker 中运行此进程,以方便使用显示进程状态的 ProgressBar。所以,如果有一个解决方案让我使用我的 ProgressBar 并在不使用 BackgroundWorker 的情况下访问剪贴板内容,我绝对欢迎它!谢谢!

0 投票
1 回答
2289 浏览

c# - Thread must be STA-Thread, but it already is

Im working on my thesis about an C# WPF program, but i ran into an error i dont understand.

Somewhere in my MainWindow Code im starting a new Thread like this:

The doSearchServer methods does the following:

The ServerConnection class is static because i also need that class in some other Windows.

At ServerConnection.authentication() the client (my Program) tries to authenticate on my server. If a password is required, i wanted to open a new PasswordWindow as you can see here:

At the PasswordWindow Contructor it crashes. I tried STA + Dispatcher, MTA + Dispatcher, STA only.. anything i tried didnt work... i really dont get it.

Can someone please explain me why it still says that the Thread needs to be an STA Thread?

Thanks for any kind of help!!

0 投票
2 回答
1456 浏览

powershell - 如何在 PowerShell 1.0 中使用 STA 模式?

我在 PowerShell 中非常尴尬,我只在家里使用它来完成我自己的简单任务,在我的 Windows XP 下没有可用的升级到 PS2。下一个测试显示我的 PowerShell 1.0 默认使用 MTA 模式。

像这样的电话......

...总是因错误而失败:

一元运算符“-”后缺少表达式。在 line:1 char:2 + -S <<<< TA c:\scripts\file.ps1

看起来我的 PS1 无法识别 –STA 开关。我做错了什么?有什么办法可以在 PS1 中以 STA 模式运行我的脚本吗?

0 投票
1 回答
97 浏览

asp.net - 尝试打开文件浏览器时出现错误

目前在我的网站上,我正在尝试获取它,以便用户可以从他们的本地图像上传图像。我遵循了一个教程,但是当我调试它并尝试打开我的图像文件夹时,我收到以下错误消息:

“在进行 OLE 调用之前,必须将当前线程设置为单线程单元 (STA) 模式。确保您的 Main 函数上标记了 STAThreadAttribute。仅当调试器附加到进程时才会引发此异常。”

请有人可以在这里帮助我,我已经阅读了一些帖子;但被视为这是我第一次这样做;我真的不明白他们。

感谢您的任何回复!

0 投票
1 回答
911 浏览

.net-4.0 - 为什么在 TeamCity 上运行此 MSpec 测试时会出现无效操作异常(非 STA 线程?)?

作为我的应用程序迁移到 .NET 4 的一部分,我正在努力让一些 WPF 单元测试再次与 TeamCity 一起工作。

在以某种方式使用 WPF 控件(例如 ListItem)的所有测试中,我得到了一个以前没有得到的异常:

我明白是什么意思,查了之后发现我的线程确实是MTA,不是STA。

我的问题是我不知道如何解决这个问题,以及这个问题可能来自哪里......它是 TeamCity 的设置吗?规格?再一次,它在我切换到 .NET 4 之前有效。

我尝试了许多不同的解决方案,但没有任何效果。

我也有点困惑,之前没有人报告过这个(使用我特定的 TeamCity + MSpec + WPF 测试堆栈),这可能意味着我在某处做错了什么。

如果你有线索,请告诉我!

完全例外:

对于这个异常,代码只是试图实例化一个 ListBoxItem,没什么特别的,但是在 MTA 线程上这样做会破坏它。

我尝试了什么:

  • 将当前线程设置为 STA

    Thread.CurrentThread.SetApartmentState(ApartmentState.STA)

它当然不起作用,因为它只有在线程开始之前才有可能

  • 在初始化为 STA 的单独线程中运行代码:非常复杂,因为由于 MSpec 的性质,不同的方法在不同的时间被调用,所以你不能在同一个线程下运行所有​​东西。更准确地说,您不能在与“因为”语句相同的线程上运行“建立上下文”。

  • 使用 STAThread 属性...是的,但在哪里?在我尝试过的任何地方都没有工作过

失败测试示例:

0 投票
2 回答
1788 浏览

asp.net - ASP.NET WCF 服务错误“调用线程必须是 STA,因为许多 UI 组件都需要这个。”?

我有一些使用一些 .net 程序集的窗口工作流。我正在从这些工作流窗口访问一些硬件。我通过虚拟目录方法在 IIS 上发布的 XYZ 服务对这一切都有帮助。现在我想从我的 .Net Web 应用程序中使用这些工作流。我做了一个 wcf 服务和一个 web 客户端。我的 wcf 服务(根据 Web 客户端请求)加载工作流(成功)并尝试执行。

问题是当我调用加载的工作流的执行时,它给出了异常“调用线程必须是 STA,因为许多 UI 组件都需要这个。”