Tag: sta

如何在STA线程中运行一些东西?

在我的WPF应用程序中,我做了一些asynchronous通信(与服务器)。 在callback函数中,我最终从服务器的结果中创buildInkPresenter对象。 这要求正在运行的线程是STA,显然它现在不是。 因此,我得到以下例外: 无法在程序集[..]中创build'InkPresenter'实例。调用线程必须是STA,因为许多UI组件都需要这个。 目前我的asynchronous函数调用是这样的: public void SearchForFooAsync(string searchString) { var caller = new Func<string, Foo>(_patientProxy.SearchForFoo); caller.BeginInvoke(searchString, new AsyncCallback(SearchForFooCallbackMethod), null); } 我如何使callback – 这将做InkPresenter创build – 是STA? 或者在新的STA线程中调用XamlReaderparsing。 public void SearchForFooCallbackMethod(IAsyncResult ar) { var foo = GetFooFromAsyncResult(ar); var inkPresenter = XamlReader.Parse(foo.Xaml) as InkPresenter; // <!– Requires STA [..] }

如何在STAThread模式下运行unit testing?

我想testing一个使用剪贴板(WindowsForms)的应用程序,我也需要我的Unittests中的剪贴板。 为了使用它,它应该在STA模式下运行,但由于NUnit Testfixture没有主要的方法,我不知道在哪里/如何注释它… 谢谢!

我怎样才能使后台工作线程设置为单线程公寓?

我正在创build一个自动化testing运行应用程序 在这部分应用程序中,我正在使用一个轮询服务器。 它通过不断轮询Web服务器来确定何时应该运行一个新的自动化testing(对于我们的GUI应用程序的夜间自动运行)。 当轮询服务器看到一个请求时,它下载所有需要的信息,然后在后台工作者中执行testing运行。 问题是部分testing运行在后台工作线程中发生OLE,COM和其他调用(例如, Clipboard.Clear() )。 发生这些调用之一时,会发生以下exception: 当前的线程必须设置为单线程单元(STA)模式才能进行OLE调用。 确保你的Main函数有标记的STAThreadAttribute。 我怎样才能标记一个后台工作线程作为单线程的公寓? 我的Program.cs中的Main调用显然已经有了这个属性。

STAThread和multithreading

从MSDN文章STAThread: 指示应用程序的COM线程模型是单线程单元(STA)。 (供参考,这是整篇文章 。) 单线程的公寓…好吧,那就超过了我的头。 另外,我读了一个地方,除非你的应用程序使用COM互操作,这个属性实际上什么都不做。 那么它究竟做了什么,它如何影响multithreading应用程序呢? 如果multithreading应用程序(包括任何使用Timers的asynchronous方法调用,而不仅仅是线程池等)都使用MTAThread,即使它只是为了安全起见。 STAThread和MTAThread实际上做了什么?

单线程单元 – 不能实例化ActiveX控件

我需要获取有关HTML页面中应用的CSS样式的信息。 我用AxWebBrowser和迭代IHTMLDOMNode。 我能够获取所需的所有数据,并将代码移到我的应用程序中。 问题是,这部分运行在后台工作人员,我试图实例化控制exception。 AxWebBrowser browser = new AxWebBrowser(); ActiveX control '8856f961-340a-11d0-a96b-00c04fd705a2' cannot be instantiated because the current thread is not in a single-threaded apartment. 有没有办法如何解决这个或其他选项比AxWebBrowser?

如何将消息发布到运行消息泵的STA线程?

所以,在这之后 ,我决定在一个专用STA线程上显式实例化一个COM对象。 实验表明,COM对象需要一个消息泵,我通过调用Application.Run()创build消息泵: private MyComObj _myComObj; // Called from Main(): Thread myStaThread = new Thread(() => { _myComObj = new MyComObj(); _myComObj.SomethingHappenedEvent += OnSomthingHappened; Application.Run(); }); myStaThread.SetApartmentState(ApartmentState.STA); myStaThread.Start(); 我如何从其他线程发布消息STA线程的消息泵? 注意:为了简洁起见,我大量地编辑了这个问题。 现在@Servy的答案的一些部分似乎是无关的,但他们是原来的问题。