Ответ 1
Попробуйте вызвать код у диспетчера:
Application.Current.Dispatcher.Invoke((Action)delegate{
// your code
});
Я использую 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...
}
Попробуйте вызвать код у диспетчера:
Application.Current.Dispatcher.Invoke((Action)delegate{
// your code
});
Если вы делаете вызов из основного потока, вы должны добавить атрибут STAThread к методу Main, как указано в предыдущем ответе.
Если вы используете отдельный поток, он должен быть в STA (однопоточной квартире), что не относится к потокам рабочего потока. Вы должны сами создать поток, например:
Thread t = new Thread(ThreadProc);
t.SetApartmentState(ApartmentState.STA);
t.Start();
с ThreadProc является делегатом типа ThreadStart.
Я подозреваю, что вы получаете обратный вызов для компонента пользовательского интерфейса из фонового потока. Я рекомендую вам сделать этот вызов с помощью BackgroundWorker, поскольку это поток сообщений в интерфейсе.
Для 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.
Просто пометьте вашу программу атрибутом [STAThread]
и ошибка исчезнет! это волшебство :)
Если вы вызываете оператор UI нового окна в существующий поток, он выдает ошибку. Вместо этого создайте новый поток внутри основного потока и напишите оператор UI окна в новом дочернем потоке.