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

c# - 如何检查当前线程的公寓状态?

我有一个需要在 STA 公寓状态下运行的功能。我不想检查它是否作为 STA 运行,如果没有生成一个在 STA 中运行的新线程。

如何检查当前线程正在运行的公寓状态?

0 投票
2 回答
3836 浏览

.net - 使用 WPF UI 线程应该始终确保 STA 单元模式,对吗?

在我的 WPF 应用程序中,我与服务器异步通信。因此回调将不会在 UI 线程中运行,并且因为我需要在那里做一些 WPF 的东西(创建 InkPresenter 对象),所以我需要它在 UI 线程上运行。好吧,实际上要求是它在具有 STA 单元模式的线程上运行。我尝试使用 STA 模式创建一个新线程,但结果是 UI 线程无法访问 InkPresenter,因为它“由不同的线程拥有”。

我想要在回调中做的是使用 Dispatcher 来调用我需要 STA 的函数。这听起来像是正确的方法吗?我现在这样做,但它仍然失败。在我的回调函数中,我触发了以下函数,该函数现在尝试确保寻址的函数在 UI 线程上运行。

正如您从示例中看到的那样,我使用 CheckAccess() 来确保仅在 UI 线程上尚未运行该函数时才调用该函数。当我的回调调用此函数时,CheckAccess() 始终为 true,但Dispatcher.CurrentDispatcher.Thread.ApartmentState为 MTA。为什么?我尝试删除 CheckAccess() 并始终执行 Invoke,但 ApartmentState 仍然是 MTA,并且创建 InkPresenter 失败。

谁能解释一下我在这里做错了什么?我有错误的调度程序或什么?这是确保在 UI 线程上运行某些东西的正确方法吗?

0 投票
4 回答
25242 浏览

c# - 如何在 STAThread 模式下运行单元测试?

我想测试一个使用剪贴板(WindowsForms)的应用程序,我的单元测试中也需要剪贴板。为了使用它,它应该在 STA 模式下运行,但由于 NUnitTestFixture没有 main 方法,我不知道在哪里/如何注释它。

0 投票
5 回答
15027 浏览

c# - Process.Start 阻塞

我正在调用 Process.Start,但它阻塞了当前线程。

即使进程关闭,代码也不再响应。

但是 Process.Start 真的应该阻塞吗?这是怎么回事?

(进程正确启动)


控制台输出为:

--- 按 ENTER 停止服务 --- 启动进程。


找到了:

[STA线程]

使 Process.Start 阻塞。我阅读了STAThread 和 Multithreading,但我无法将这些概念与 Process.Start 行为联系起来。

AFAIK, Windows.Form需要STAThread 。使用 Windows.Form 时如何解决此问题?


地狱新闻:

如果我重建我的应用程序,我一次运行应用程序时可以正常工作,但是如果我停止调试并再次重新启动,问题就会出现。

在没有调试器的情况下执行应用程序时不会出现问题。

0 投票
1 回答
249 浏览

fitnesse - STA 在 Slim (FitNesse) 中无法识别

我为 Slim 编写了一个自定义表类,它允许用户编写用于运行自动化测试的命令。所有命令现在都在工作,除了一个依赖于必须在 STA 线程中进行的特定调用的命令。通过将 STA 添加到 suiteConfig 文件,我能够在 Fit 中解决此问题。但是,将其添加到 Slim 配置中似乎不起作用。这是我的代码:

!define TEST_SYSTEM {slim}
!define COMMAND_PATTERN {%m -c C:\..\Slim\slim.config.xml}
!define TEST_RUNNER {C:\..\Slim\Runner.exe}

<suiteConfig>
<ApplicationUnderTest>
<AddAssembly>C:\..\Slim\fit.dll</AddAssembly>
<AddAssembly>C:\..\Slim\fitSharp.dll</AddAssembly>
</ApplicationUnderTest>
<Settings>
<ApartmentState>STA</ApartmentState>
<Runner>fitSharp.Slim.Service.Runner</Runner>
</Settings>
<FileExclusions>
<Add>^\.svn$</Add>
</FileExclusions>
</suiteConfig>

为什么 STA 模式在 Fit 中的效果与在 Slim 中的效果不同?我需要在命令模式或配置文件中修改什么吗?任何帮助将非常感激!

山姆

0 投票
2 回答
3310 浏览

wcf - 在 IIS (7+) 中托管的 WCF 服务中使用时如何处理 STA COM 组件?

据我了解,当从MTA线程使用标记为使用STA的 COM 组件时,应该将调用编组到 STA 线程并从该专用线程执行。对于 Windows 客户端应用程序,这意味着它将在 UI 线程上执行(如果标记为 STA),并且从 COM 组件到我的回调将由发送到隐藏窗口的 Windows 消息处理并在Windows 消息循环。

但是,如果我在 IIS 中托管的 WCF 服务中使用 STA COM 组件会发生什么?工作进程是否会在 STA 线程上有 Windows 消息循环?我可以使用自己的消息循环启动自己的 STA 线程吗?

0 投票
1 回答
395 浏览

.net - .NET 中的哪些阻塞线程操作将在阻塞时处理 COM 消息?

在创建新的 STA 线程来承载 STA COM 组件时,该线程负责泵送与 COM 相关的 Windows 消息。据我所知,某些内置的 .NET 线程原语,例如 lock (Monitor.Enter) 会在等待对象被另一个线程释放时为您执行此操作。我见过的另一种为您制作 .NET 泵 COM 消息的方法是使用 .Join()。

在哪里可以找到具有这种行为的内置线程原语的完整列表?等待 WaitHandle 会支持这个吗?WaitAny() 或 .NET 4 中的新并发集合怎么样?我无法在任何特定方法的文档中找到它。

0 投票
1 回答
607 浏览

wpf - WPF 应用程序中的蓝色 STA 线程异常

我收到异常“调用线程必须是 STA,因为许多 UI 组件都需要这个。” 这很愚蠢,因为正在从 STA 线程中调用给出异常的构造函数!

我真的走投无路了。有没有其他人遇到过这个问题?

0 投票
1 回答
1153 浏览

multithreading - ElementHost 给我“调用线程必须是 STA,因为许多 UI 组件都需要这个。”

我刚刚在 Windows 窗体中添加了一个 ElementHost(窗体中还有其他一些 c# 代码)。然后它给了我错误“调用线程必须是 STA,因为许多 UI 组件都需要这个。” 我将线程更改为 STA,但它阻止了其他事情……有没有办法让 elementhost 工作而不接触任何其他代码?

这是我如何更改线程的代码:

0 投票
2 回答
180 浏览

c# - 试图理解日志阅读器

我试图理解一些代码。它是一个打印日志数据的小程序。它是通过使用由 DataTable 填充的 DataGridView 创建一个表单来完成的。表单类还具有刷新功能(RefreshPresentation)。BusinessLogic 类执行更新 DataTable 和调用表单中的刷新函数的实际工作。所以我非常了解它的功能,但不知道为什么程序的结构是这样的。

  1. 为什么 businessLogic.DoWork 作为线程而不是普通的方法调用运行?
  2. 有人可以为我解释一下 RefreshPresentation 功能吗?(BeginInvoke 和委托)
  3. 将 MainForm 作为参数传递给 BusinessLogic 是一个好主意/做法吗?

这是应用程序的主要入口点。

这是表格的相关部分。

这就是业务逻辑。