Этот вопрос связан с популярнейших комментарием this question:C# - Почему Control. (Начало) Вызывает необходимость, хотя пользовательский интерфейс работает в STAThread?
Модель STA используется для COM-объектов, которые не являются поточно. Это означает, что они не выполняют свою собственную синхронизацию. Общим использованием этого является компонент пользовательского интерфейса. Поэтому, если другой поток должен взаимодействовать с объектом (например, нажимать кнопку в форме), тогда сообщение сортируется по потоку STA. Примером этого является система обработки сообщений в виде окон.
Так следующий пример путает меня немного ..
Главная помечается [STAThread]
.
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
я предполагая, что, поскольку Form1 работает в STAThread, каждое сообщение в UI-компонент, который посылается от другой нити ранжированы на резьбу STA.
Поэтому я ожидал, что вызов, как это будет работать:
public Form1()
{
InitializeComponent();
Thread t = new Thread(() => { this.label1.Text = "test"; });
t.IsBackground = true;
t.Start();
}
Как обсуждалось во многих других должностей, он не будет работать. Thread t ...
должен быть заменен чем-то вроде Thread t = new Thread(()=> { this.label1.Invoke((Action)(() => { this.label1.Text = "test"; })); });
, чтобы исправить это, но имея в виду, что STA должен marshall this.label1.Text = "test";
на mainthread, почему я все еще получаю недопустимую ошибку доступа к перекрестным потокам?
Edit решаемая:
Принято Ответ:
[STAThread]
(и[MTAThread]
) относятся только к работе с COM Interop.
Поскольку Label-Object, кажется, только оболочкой для управления Win32, это не COM-объект (как ошибочно ожидали от меня из-за BLOCKQUOTE в начале этого вопроса), и поэтому требует не быть распределенным. Существуют проверки вызовов из других потоков внутри обертки, но маршаллинг через (Begin) Invoke должен выполняться разработчиком.
Предстоящий вопрос, конечно же: как можно модифицировать обертку, так что это делается автоматически и с минимальной совместимостью .. но это другая тема, я думаю.
* «что STA должно быть маршалом» * Должно ли? Темы - это контекст исполнения, они не имеют никакой логики или не знают, что такое форма, или знают, что эта вещь в структуре имеет сходство нитей, и это не так. Это твоя работа. – Will
@WA [STA] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms680112 (v = vs.85) .aspx) - это не сам поток. – ChrisG
Это поточный парадигма. Акцент на темы. – Will