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

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

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

Вызывающий поток должен быть 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...
}

Ответ 1

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

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

Ответ 2

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

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

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

t.Start();

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

Ответ 3

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

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

Ответ 4

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

// 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();  

Ответ 5

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

Ответ 6

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

Ответ 7

Просто пометьте вашу программу атрибутом [STAThread] и ошибка исчезнет! это волшебство :)

Ответ 8

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