问题标签 [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 回答
1221 浏览

multithreading - MsgWaitForMultipleObjectsEx 在 MFC 应用程序中死锁主 STA 线程

什么是最好的做 STA 线程同步?

我有一个基于对话框的 MFC 应用程序,它有两个 STA 线程:主线程和第二线程。我在主 UI 线程中创建了 COM 对象。

我从第二个线程调用 COM 接口。在主线程中,为了确保第二个线程在主线程继续之前完成,我使用循环来等待线程。此循环循环调用 MsgWaitForMultipleObjectsEx(timout=500)。

我立即陷入了等待的僵局。然后我意识到 MFC 消息泵 AfxInternalPumpMessage() 仅有助于阻塞调用,但对死锁情况毫无帮助。

然后我将 Peek/Translate/DispatchMessage 代码添加到等待循环中,然后一切正常。

现在,似乎没有手动编码 Peek/Translate/DispatchMessage 循环,您根本无法进行 STA 线程同步?任何等待电话都会使您陷入僵局。那么同步 STA 线程的最佳或标准方法是什么?

谢谢!

0 投票
3 回答
13407 浏览

visual-c++ - COM 出站调用导致“无法进行传出调用,因为应用程序正在调度输入同步调用。”

我有一个 COM 服务器(C++/STA(基于 MFC 的应用程序))和一个 COM 客户端(C#/MTA)。COM 服务器必须存在于 STA 中,因为它是一个 MFC 应用程序(我在这件事上别无选择)。客户端向服务器发出调用,服务器向客户端发出回调。这就是错误发生的地方(RPC_E_CANTCALLOUT_ININPUTSYNCCALL)。我猜如果服务器是 MTA,这个问题永远不会出现,但遗憾的是,MFC 的文档明确否认将公寓初始化为 MTA。

关于如何解决这个问题的任何想法?

我一直在玩弄让服务器对象(我通过运行对象表公开的对象)存在于它自己的公寓 (MTA) 中的想法。这是一个好主意,还是先尝试一些更简单的方法?

更新

服务器对象只是应用程序中某些功能的一个薄接口点。大多数情况下,它只是读取和写入内存位置,但在某些情况下,它会为应用程序中的各个窗口生成窗口消息。服务器对象本身并不是整个应用程序。

0 投票
2 回答
1062 浏览

c# - 在 wpf 中显示 System.Windows.Forms.FolderBrowserDialog 时出现异常

我试图folderbrowserdialog在 wpf 中显示,但我得到了这个异常

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

我尝试在此函数之前添加 [STAThread] 但没有更改如何解决此异常?

功能是:

0 投票
2 回答
5590 浏览

c# - 如何在 C# 中为 COM STA 线程泵送消息?

我有一个主 STA 线程,它在 COM 对象上调用很多方法,还有一个辅助 STA 线程,它也在同一个对象上做很多工作。我希望主线程和辅助线程并行工作(即我希望主线程和辅助线程的交错输出)。我知道我需要时不时地在主线程中发送消息——在 C++ 中调用 Get/Translate/DispatchMessage 就可以了。

但是我在 C# 中使用相同的策略时遇到问题。起初我在主线程中使用 CurrentThread.Join() 来控制第二个线程。它没有用。然后我转向 Application.DoEvents() - 每当我希望第二个线程运行时,我都会在主线程中调用它。结果是第二个线程迅速抓住了控制权并且不会放手——在第二个线程全部完成之前,主线程无法继续。

我读过文档说 Application.DoEvents() 将处理所有等待事件 - 而 GetMessage() 只检索一条消息。

正确的做法是什么?是否存在与 Get/Translate/DispatchMessage 等效的 C#?

谢谢

更新:第二个线程运行太快,向主 STA 线程发送大量 COM 调用消息。我只是在第二个线程中添加了延迟以减慢它的速度。现在两个线程基本上是并行运行的。但我仍然想知道是否存在与 GetMessage/TranslateMessage/DispatchMessage 等效的 C#。

0 投票
2 回答
4684 浏览

c# - 控制台应用程序中 STAThread COM 调用的 C# 计时器

我有一个控制台应用程序需要触发使用 COM 的方法。程序以 [STAThread] 开始。该程序在不使用定时器进程时正确执行,但在使用定时器时显然会阻塞返回控制台。

我使用过 System.Threading.Timer 和 System.Timers.Timer 都没有工作。目前我添加了一个线程调用使用 COM 的方法 (Transmit())。如果我用 Console.Readline 清除主线程,程序会在 COM 对象被阻塞的地方恢复,但当然程序会关闭,我会失去所需的计时器功能。

在使用控制台应用程序时,我无法弄清楚如何设置 SynchronizingObject 以获取 ISynchronizeInvoke 回调。

我不是在寻找多个线程,我只需要定期调用 Transmit 方法并使用 COM,同时将结果返回到控制台。

0 投票
0 回答
909 浏览

c# - 使用 STA 进行 WebBrowser 控制

我正在尝试将 WebBrowser 添加到应用程序以显示网页,但线程类型一直存在问题。

目前我得到:

无法实例化 ActiveX 控件“8856f961-340a-11d0-a96b-00c04fd705a2”,因为当前线程不在单线程单元中。

我发现这个问题与这个问题有关:单线程公寓 - 无法实例化 ActiveX 控件

但是,我的代码中没有 Main() 方法,当我尝试解决该问题时,在将 WebBrowser 添加到表单控件时遇到错误。


我正在使用此处找到的代码:

http://www.apress.com/9781430228530

直接下载: http: //www.apress.com/downloadable/download/sample/sample_id/1173/

我在第 14 章的 Horizo​​ntalExplorerBar 文件夹中。


这是我用作参考的代码:

0 投票
1 回答
1757 浏览

.net - 调用线程必须是 STA,因为很多 UI 组件都需要这个

我知道,关于 SO 有很多类似的问题。但是我有一个很奇怪的情况:我在 Dispatcher.CurrentDispatcher.Invoke 中执行时遇到了这个异常。我不知道如何解决它。

这是我的 StackTrace(你可以看到那里调用了调度程序):

System.Windows.Input.InputManager.GetCurrentInputManagerImpl() 在 System.Windows.Input.KeyboardNavigation..ctor() 在 System.Windows.FrameworkElement.FrameworkServices..ctor() 在 System.Windows.FrameworkElement.EnsureFrameworkServices() 在系统。 Windows.FrameworkElement..ctor() 在 System.Windows.Controls.Control..ctor() 在 System.Windows.Controls.UserControl..ctor() 在 MCC.PresentationUtilities.ClosingAwareViewModelUserControl..ctor() 在 MCC.TherapyDeviceManager。 PatientDetailUI.Views.PatientDetailView..ctor() 在 D:\WTS\WTS3\WTS\MCC.TherapyDeviceManager.PatientDetailUI\Views\PatientDetailView.xaml.cs: MCC.TherapyDeviceManager.MultipleViewHost.Managers.TabItemFactory.PatientTabItemFactory.CreateEditableView 的第 11 行D 中的(PatientDetailViewModel vm):\WTS\WTS3\WTS\MCC.TherapyDeviceManager.MultipleViewHost\Managers\TabItemFactory\PatientTabItemFactory.cs:第 41 行 MCC.TherapyDeviceManager.MultipleViewHost.Managers.TabItemFactory.PatientTabItemFactory.Create(SelectedPatientChangedEventArgs 患者,IClosableController& 控制器) 在 D:\WTS\ WTS3\WTS\MCC.TherapyDeviceManager.MultipleViewHost\Managers\TabItemFactory\PatientTabItemFactory.cs:D:\WTS\WTS3\WTS\MCC.TherapyDeviceManager 中 MCC.TherapyDeviceManager.MultipleViewHost.Managers.PatientEventsManager.CreateNewPatientTab(SelectedPatientChangedEventArgs patientInfo) 的第 31 行。 MultipleViewHost\Managers\PatientEventsManager.cs:D:\WTS\WTS3\WTS\MCC 中 MCC.TherapyDeviceManager.MultipleViewHost.Managers.PatientEventsManager.AddPatientView(SelectedPatientChangedEventArgs PatientInfo) 的第 94 行。TherapyDeviceManager.MultipleViewHost\Managers\PatientEventsManager.cs:第 75 行 MCC.TherapyDeviceManager.MultipleViewHost.Managers.PatientEventsManager.DataImportFinishedHandler(DataImportFinishedEventArgs dataImportFinishedEventArgs) 在 D:\WTS\WTS3\WTS\MCC.TherapyDeviceManager.MultipleViewHost\Managers\PatientEventsManager.cs: Microsoft.Practices.Composite.Events.EventSubscription 的第 41 行1.InvokeAction(Action1 个动作,TPayload 参数)在 D:\WTS\WTS3\WTS\MCC.TherapyDeviceManager.Definitions\Prism\EventSubscription.cs:第 122 行 Microsoft.Practices.Composite.Events.EventSubscription 1.<>c__DisplayClass2.<GetExecutionStrategy>b__0(Object[] arguments) in D:\WTS\WTS3\WTS\MCC.TherapyDeviceManager.Definitions\Prism\EventSubscription.cs:line 108 at Microsoft.Practices.Composite.Events.EventBase.InternalPublish(Object[] arguments) in D:\WTS\WTS3\WTS\MCC.TherapyDeviceManager.Definitions\Prism\EventBase.cs:line 69 at Microsoft.Practices.Composite.Presentation.Events.CompositePresentationEvent1.Publish(TPayload payload) 在 D: \WTS\WTS3\WTS\MCC.TherapyDeviceManager.Definitions\Prism\CompositePresentationEvent.cs:MCC.TherapyDeviceManager.DeviceManager.DataRecordManager 的第 168 行。<>c_ DisplayClass5.b_4() 在 D:\WTS\WTS3\WTS\MCC.TherapyDeviceManager.DeviceManager\DataRecordManager.cs:第 247 行,位于 MS.Internal 的 System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)。 Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) 在 System.Windows.Threading.DispatcherOperation.InvokeImpl() 在 System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state) 在 System。 Threading.ExecutionContext.runTryCode(Object userData) 在 System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode 代码,CleanupCode backoutCode,Object userData) 在 System.Threading.ExecutionContext。RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)在 System.Windows.Threading.DispatcherOperation.Invoke() 在 System.Windows.Threading.Dispatcher.ProcessQueue() 在 System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& 处理)在 MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean&handled) 在 MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) 在 System.Windows。Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 在 MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) 在 System.Windows.Threading.Dispatcher。在 MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) 在 MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG & msg) 的 InvokeImpl(DispatcherPriority 优先级, TimeSpan 超时, 委托方法, 对象参数, Int32 numArgs)在 System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) 在 System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame) 在 System.Windows.Threading.DispatcherOperation.Wait(TimeSpan timeout) 在 System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority 优先级,TimeSpan 超时,Delegate 方法,Object args,Int32 numArgs)在 System.Windows.Threading.Dispatcher.Invoke(Delegate 方法,Object[] args)在 MCC.TherapyDeviceManager.DeviceManager.DataRecordManager D:\WTS\WTS3\WTS\MCC.TherapyDeviceManager.DeviceManager\DataRecordManager.cs 中的 .DataImportedIntoDb(Patient patient, DetectedDevice detectedDevice, DataRecord dataRecord): D 中 MCC.TherapyDeviceManager.DeviceManager.DataRecordManager.Process(DetectedDeviceInfo detectedDeviceInfo) 的第 247 行:\WTS\WTS3\WTS\MCC.TherapyDeviceManager.DeviceManager\DataRecordManager.cs:D:\WTS\WTS3\WTS\MCC 中 MCC.TherapyDeviceManager.DeviceManager.DeviceToDatabaseSaverManager.CreateOrUpdateDeviceEntity(IDeviceDataInfo deviceDataInfo) 的第 66 行。TherapyDeviceManager.DeviceManager\DeviceToDatabaseSaverManager.cs:MCC 的第 106 行。TherapyDeviceManager.DeviceManager.DeviceToDatabaseSaverManager.FoundDevice(IDeviceDataInfo deviceDataInfo) 在 D:\WTS\WTS3\WTS\MCC.TherapyDeviceManager.DeviceManager\DeviceToDatabaseSaverManager.cs:MCC.TherapyDeviceManager 的第 88 行.DeviceManager.DeviceToDatabaseSaverManager.DeviceDetectedHandler(Object sender, DetectedDeviceInfoEventArgs e) 在 D:\WTS\WTS3\WTS\MCC.TherapyDeviceManager.DeviceManager\DeviceToDatabaseSaverManager.cs: MCC.Devices.DeviceDetection.ConnectionManagers.ConnectionManagerAggregator.OnDeviceDetected(DetectedDeviceInfoEventArgs e) 的第 70 行) 在 D:\WTS\WTS3\WTS\MCC.Devices.DetectService\ConnectionManagers\ConnectionManagerAggregator.cs: MCC.Devices.DeviceDetection 的第 22 行。ConnectionManagers.ConnectionManagerAggregator.DeviceDetectedHandler(Object sender, DetectedDeviceInfoEventArgs e) 在 D:\WTS\WTS3\WTS\MCC.Devices.DetectService\ConnectionManagers\ConnectionManagerAggregator.cs: MCC.Devices.DeviceDetection.ConnectionManagers.SpecificConnectionManagerBase 58 行2.OnDeviceDetected(DetectedDeviceInfoEventArgs e) in D:\WTS\WTS3\WTS\MCC.Devices.DetectService\ConnectionManagers\SpecificConnectionManagerBase.cs:line 33 at MCC.Devices.DeviceDetection.ConnectionManagers.SpecificConnectionManagerBase2.AddDevice(TConnection connection, DeviceData device) in D:\WTS\WTS3\WTS\MCC.Devices.DetectService\ConnectionManagers\SpecificConnectionManagerBase.cs: MCC.Devices.DeviceDetection.ConnectionManagers.SpecificConnectionManagerBase 258 行2.FoundDevice(TConnection connection, DeviceData newlyDetectedDevice) in D:\WTS\WTS3\WTS\MCC.Devices.DetectService\ConnectionManagers\SpecificConnectionManagerBase.cs:line 229 at MCC.Devices.DeviceDetection.ConnectionManagers.SpecificConnectionManagerBase2.DetectDeviceOnAquiredConnection(TConnection connection ) 在 D:\WTS\WTS3\WTS\MCC.Devices.DetectService\ConnectionManagers\SpecificConnectionManagerBase.cs:第 185 行 MCC.Devices.DeviceDetection.ConnectionManagers.SpecificConnectionManagerBase 2.Poll(TConnection connection) in D:\WTS\WTS3\WTS\MCC.Devices.DetectService\ConnectionManagers\SpecificConnectionManagerBase.cs:line 166 at MCC.Devices.DeviceDetection.ConnectionManagers.Managers.SdConnectionManager.Poll(FileConnection connection) in D:\WTS\WTS3\WTS\MCC.Devices.DetectService\ConnectionManagers\Managers\SdConnectionManager.cs:line 51 at MCC.Devices.DeviceDetection.ConnectionManagers.SpecificConnectionManagerBase2.PollingCycle(Object tokenObject, TConnectionMetadata detectedConnectionMetadata) 在 D:\WTS \WTS3\WTS\MCC.Devices.DetectService\ConnectionManagers\SpecificConnectionManagerBase.cs:第 142 行

0 投票
0 回答
251 浏览

c# - 从主窗体使用 WebBrowser 调用另一个窗体 - 给出错误?

我从我的 form1 调用 from3 并在 InitializeComponent() 中给出了这个错误

错误“无法实例化 ActiveX 控件 '8856f961-340a-11d0-a96b-00c04fd705a2',因为当前线程不在单线程单元中。”

from3 有一个 WebBrowser 控件,而我的 from1 正在运行一个后台工作程序

谢谢

0 投票
1 回答
3896 浏览

c# - C# WebBrowser 错误线程

我无法让表单中的网络浏览器正常工作。当我运行时,我收到此错误 ActiveX 控件 '8856f961-340a-11d0-a96b-00c04fd705a2' 无法实例化,因为当前线程不在单线程单元中。

它把我带到表单designer.cs文件到这个文本 this.webBrowser2 = new System.Windows.Forms.WebBrowser(); 我真的不知道该怎么做才能让浏览器正常工作。

我在 Program.cs 文件中尝试了 MTAThread 和 STAThread 似乎无法让它工作。

谢谢

0 投票
2 回答
1808 浏览

c# - 如何编写使用 C# 键盘类的 dll 函数

我想使用以下代码在某个时间访问键盘的状态。

此代码需要一些 dll 才能编译:WindowsBase.dll 和 PresentationCore.dll

键盘需要一个 STA 线程,通常我会将 [STAThread] 属性写入主函数并且它会工作,但此代码将用作 dll,所以我不能这样做。我的函数 ThisIsCalledByAnExternalProgram() 必须作为 STA 运行,但它没有。

我如何让这段代码作为 dll 工作?

编辑:当您在 STAThread 标记的方法中调用 ThisIsCalledByAnExternalProgram() 时会发生什么?

当我用我的外部程序调用该函数时,我得到一个异常: System.InvalidOperationException: ...调用线程必须是 STA,因为许多 UI 组件都需要这个。堆栈是:

编辑#3:我误读了这个问题 - ...在标记的 STAThread 内...我目前无法尝试这个。假设它通过并工作 - 这仍然不能解决问题,因为我无法控制调用程序。

编辑#2:使用 Win32 钩子:由于可移植性,我想留在 .net 中。所有全局钩子变量最终都依赖于虚拟机下面的机器,我想使用准备好的c#键盘类。

它在不同的上下文中工作 - 这是一个简短的演示: