Вызывающий stream должен быть STA, потому что многие компоненты пользовательского интерфейса требуют этого

Я использую http://www.codeproject.com/KB/IP/Facebook_API.aspx

Я пытаюсь вызвать XAML, который создается с помощью WPF . Но это дает мне ошибку:

Вызывающий stream должен быть STA, потому что для этого требуется множество компонентов пользовательского интерфейса.

Я не знаю, что делать. Я пытаюсь это сделать:

FacebookApplication.FacebookFriendsList ffl = new FacebookFriendsList(); 

Но это дает мне эту ошибку.

Я добавил фонового работника:

 static BackgroundWorker bw = new BackgroundWorker(); static void Main(string[] args) { bw.DoWork += bw_DoWork; bw.RunWorkerAsync("Message to worker"); Console.ReadLine(); } static void bw_DoWork(object sender, DoWorkEventArgs e) { // This is called on the worker thread FacebookApplication.FacebookFriendsList ffl = new FacebookFriendsList(); Console.WriteLine(e.Argument); // Writes "Message to worker" // Perform time-consuming task... } 

Попробуйте вызвать код у диспетчера :

 Application.Current.Dispatcher.Invoke((Action)delegate{ // your code }); 

Если вы делаете вызов из основного streamа, вы должны добавить атрибут STAThread к методу Main, как указано в предыдущем ответе.

Если вы используете отдельный stream, он должен быть в STA (однопоточной квартире), что не относится к streamам рабочего streamа. Вы должны сами создать stream, например:

 Thread t = new Thread(ThreadProc); t.SetApartmentState(ApartmentState.STA); t.Start(); 

с ThreadProc является делегатом типа ThreadStart.

Я подозреваю, что вы получаете обратный вызов для компонента пользовательского интерфейса из фонового streamа. Я рекомендую вам сделать этот вызов с помощью BackgroundWorker, поскольку это stream сообщений в пользовательском интерфейсе.

Для BackgroundWorker основная программа должна быть отмечена как [STAThread].

Вы также можете попробовать это

 // create a thread Thread newWindowThread = new Thread(new ThreadStart(() => { // create and show the window FaxImageLoad obj = new FaxImageLoad(destination); obj.Show(); // start the Dispatcher processing System.Windows.Threading.Dispatcher.Run(); })); // set the apartment state newWindowThread.SetApartmentState(ApartmentState.STA); // make the thread a background thread newWindowThread.IsBackground = true; // start the thread newWindowThread.Start(); 

Application.Current.Dispatcher.Invoke ((Action) delegate {// помещаем здесь код});

Для меня эта ошибка возникла из-за передачи пустого параметра. Проверка значений переменных исправила мою проблему без изменения кода. Я использовал BackgroundWorker.

Если вы вызываете новый оператор UI windows в существующем streamе, он выдает ошибку. Вместо этого создайте новый stream внутри основного streamа и запишите оператор windows UI в новый дочерний stream.

  • {x: Null} против прозрачного?
  • Лучший способ использовать векторное изображение в WPF?
  • Как изменить шаблон заголовка Pivot в Windows Phone 8
  • Как создать пользовательский элемент управления WPF с содержимым NAMED
  • Как получить TextBox, чтобы принимать только числовые данные в WPF?
  • В WPF можно фильтровать CollectionViewSource без кода?
  • Загрузка XAML во время выполнения?
  • Каков наилучший способ передать событие в ViewModel?
  • Ширина столбца DataGrid не обновляется автоматически
  • Потяните за обновлениями на Windows Phone
  • Значение * (звездочка) в WPF ColumnDefinition?
  • Давайте будем гением компьютера.