首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MTA打来的STA电话

MTA打来的STA电话
EN

Stack Overflow用户
提问于 2014-01-06 23:00:08
回答 1查看 2.5K关注 0票数 3

我刚刚开始处理STA/MTA问题,所以很抱歉这个问题很简单。在这里,我找不到真正能理解的答案。

我正在为另一款软件编写一个插件,在一个工作线程中,我需要创建一些UI元素。我知道我不能在工作线程内部这样做,因为它不是STA线程,我需要回到主线程(或者仅仅是另一个线程?)用于创建UI元素的STA线程。一些澄清将有很大帮助。

  1. 所有STA线程是否都具有相同的“权限”,即如果主线程是STA并创建窗口,则向其添加一些UI元素。然后产生另一个STA线程,而第二个线程同样创建一些UI元素,它们是否在相同的“空间”(糟糕的单词选择,但我不知道还可以使用什么)中进行操作,并且可以在不造成死亡和破坏的情况下访问对方的UI元素?还是我需要显式地跳回主/原始STA线程,并且只从那个(而不仅仅是任何) STA线程创建UI元素?
  2. 如果是这样的话(只允许一个STA线程生成UI元素),我如何正确地做到这一点?我见过很多与此相关的帖子,但出于某种原因,我不太明白到底发生了什么,我会喜欢一个真正简单的答案。

请不要,这是一种很酷的、光滑的方法.我只需要一种简单的方法,在执行的时候,我需要一些UI元素,如果这是必要的话,我需要跳回主要STA线程。

如果没有必要的话,我就把那个工作线程变成STA线程,然后继续我的工作,这样公平吗?还是我在讨好灾难?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-06 23:12:58

  1. 如果线程创建控件。即使还有其他STA线程,也只有这个特定的线程可以与它交互。
  2. 在WinForms中,您将调用控件上的一个方法:Control.Invoke,.In,WPF,您有dispatcher来执行它:Dispatcher.Invoke

WinForms:

代码语言:javascript
复制
form1.Invoke(/* a delegate for your operation */)

WPF:

代码语言:javascript
复制
window1.Dispatcher.Invoke(/* a delegate for your operation */)

您所做的不是在“单一单元”中更改对象,而是要求(调用)控制它的STA线程为您做它(您调用的委托)。您还拥有用于异步执行此操作的BeginInvoke

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20960916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档