C # WinForms: как установить основную функцию STAThreadAttribute

Я получаю следующее исключение при вызове saveFileDialog.ShowDialog() в фоновом streamе:

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

В соответствии с этим :

Чтобы устранить проблему, вставьте инструкцию:

 Threading.Thread.CurrentThread.ApartmentState = Threading.ApartmentState.STA; 

в главном праве перед заявлением Application.Run.

Но заявление Application.Run находится в Program.cs, который, похоже, сгенерирован кодом, поэтому любые изменения могут быть неожиданно потеряны. Кроме того, я не мог найти способ установить текущий stream в STA в свойствах проекта или основной формы, но, возможно, я ищу не в том месте. Каков правильный способ вызова saveFileDialog.ShowDialog() в фоновом streamе?

ShowDialog () не следует вызывать из фонового streamа – используйте Invoke (..).

 Invoke((Action)(() => { saveFileDialog.ShowDialog() })); 

Решение очень просто; Просто добавьте это поверх метода Main [STAThread]

Поэтому ваш основной метод должен выглядеть так

  [STAThread] static void Main(string[] args) { .... } 

Меня устраивает.

это должно работать, если вы создаете stream, в котором вы вызываете showDialog:

 var thread = new Thread(new ParameterizedThreadStart(param => { saveFileDialog.ShowDialog(); })); thread.SetApartmentState(ApartmentState.STA); thread.Start(); 

Добавьте следующий код в FormLoad

 private void Form1_Load(object sender, EventArgs e) { Thread myth; myth = new Thread(new System.Threading.ThreadStart(CallSaveDialog)); myth.ApartmentState = ApartmentState.STA; myth.Start(); } 

Здесь CallSaveDialog – это stream, и здесь вы можете вызвать ShowDialog как это

 void CallSaveDialog(){saveFileDialog.ShowDialog();} 

На вашем MainForm:

 if (this.InvokeRequired) { this.Invoke(saveFileDialog.ShowDialog()); } else { saveFileDialog.ShowDialog(); } 

Или, если у вас будут другие методы, которые необходимо запустить из streamа пользовательского интерфейса:

  private void DoOnUIThread(MethodInvoker d) { if (this.InvokeRequired) { this.Invoke(d); } else { d(); } } 

Затем вызовите свой метод как таковой:

  DoOnUIThread(delegate() { saveFileDialog.ShowDialog(); }); 
  • Как определить текущую нажатую клавишу?
  • WinForms DataGridView - привязка к объекту со свойством списка (переменное число столбцов)
  • Лучший способ скрыть окно от переключателя программ Alt-Tab?
  • Как получить доступ к элементу управления из статического метода?
  • как отложить выключение и запустить процесс в службе windows
  • Как рисовать округленный прямоугольник с помощью WinForms (.NET)?
  • Лучшая практика для создания многоязычного приложения в C # / WinForms?
  • Как изменить цвет progressbar в C # .NET 3.5?
  • Как определить событие EventGridView CheckBox?
  • Могу ли я разместить Windows Form внутри элемента управления
  • Пользовательские заголовки / хром в приложении WinForms
  • Давайте будем гением компьютера.