Подтвердить что ты не робот

Почему приложения WinForms STAThread по умолчанию?

При создании пустого приложения WinForms с Visual Studio шаблон имеет атрибут STAThread в основном классе приложения.

Я читал некоторые документы об этом, но я не уверен, понял ли я его вообще.

На самом деле у меня есть некоторые вопросы:

  • Почему добавлен этот атрибут?
  • Что это значит?
  • Что произойдет, если вы удалите этот атрибут?
4b9b3361

Ответ 1

1. Почему этот атрибут добавлен?

Потому что это требуется объектной моделью ActiveX. И вы можете отбросить элементы управления ActiveX на WinForm (так что там есть совместимость). Или некоторые .NET-классы используют собственные элементы управления, для которых требуется этот атрибут.

2. Что это значит?

Это означает, что поток выполняется в модели однопоточной квартиры.

3. Что произойдет, если вы удалите этот атрибут?

Если атрибут удален, поведение undefined. Программа может прерываться случайным образом, причем иногда разумные сообщения об ошибках. Например, теперь все может работать, а затем разорвать пакет обновления.

Ответ 2

Процитировать блог MSDN,

Когда применяется STAThreadAttribute, он изменяет состояние квартиры текущего потока на однопоточность. Не вдаваясь в огромную дискуссию о COM и потоке, этот атрибут обеспечивает механизм связи между текущим потоком и другими потоками, которые могут поговорить с ним через COM. Когда вы используете Windows Forms, в зависимости от используемой функции, для взаимодействия с компонентами операционной системы может использоваться COM-взаимодействие. Хорошими примерами этого являются диалоговые окна "Буфер обмена" и "Файл".

Ответ 3

3.Что произойдет, если вы удалите этот атрибут?

Я просто добавлю простой пример, демонстрирующий проблему.

Я создал простое приложение WinForms с кнопкой и OpenFileDialog. При нажатии кнопки я запускаю поток, который показывает openFileDialog. Я запускаю приложение с помощью и без STAThread, и результаты нажатия кнопки одинаковы - это исключает исключение. Работа кросс-потоков недействительна: Control 'Form1' обращается из потока, отличного от потока, который был создан на ". Похоже, нет никакой разницы. Но нет.

Затем я изменил отображение openFileDialog, вызвав метод ниже:

private void ShowOFD()
{
    if (InvokeRequired)
    {
        BeginInvoke(new Action(ShowOFD));
        return;
    }

    openFileDialog1.ShowDialog(this);
}

С STAThread он отлично работает, как и ожидалось. Без STAThread это исключает исключение: "Текущий поток должен быть настроен на режим однопоточной квартиры (STA) до того, как вызовы OLE могут быть сделаны. Убедитесь, что ваша основная функция имеет STAThreadAttribute, отмеченный на нем. Это исключение возникает только в том случае, если к процессу прикреплен отладчик.

Затем я запускаю приложение несколько раз без отладчика (отдельно от визуальной студии). Один раз приложение просто закрылось, в другое время приложение закрылось сообщением "vshost перестало работать"

Ответ 4

Это означает, что программы Windows Forms используют однопотоковое состояние квартиры. MTA и свободные поточные состояния квартиры не поддерживаются.