Ich verwende http://www.codeproject.com/KB/IP/Facebook_API.aspx
Ich versuche, das XAML aufzurufen, das mit WPF erstellt wird. Aber es gibt einen Fehler:
Der aufrufende Thread muss STA sein, da viele UI-Komponenten dies erfordern.
Ich weiß nicht was ich tun soll. Ich versuche das zu tun:
FacebookApplication.FacebookFriendsList ffl = new FacebookFriendsList();
Aber es gibt mir diesen Fehler.
Ich habe einen Hintergrundarbeiter hinzugefügt:
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...
}
Versuchen Sie, Ihren Code vom dispatcher aufzurufen:
Application.Current.Dispatcher.Invoke((Action)delegate{
// your code
});
Wenn Sie den Aufruf vom Haupt-Thread aus durchführen, müssen Sie das STAThread-Attribut der Main-Methode hinzufügen, wie in der vorherigen Antwort angegeben.
Wenn Sie einen separaten Thread verwenden, muss es sich in einer STA (Single Threaded Apartment) befinden, was bei Hintergrund-Worker-Threads nicht der Fall ist. Sie müssen den Thread selbst so erstellen:
Thread t = new Thread(ThreadProc);
t.SetApartmentState(ApartmentState.STA);
t.Start();
wobei ThreadProc ein Delegat des Typs ThreadStart ist.
Ich vermute, dass Sie von einem Hintergrund-Thread einen Rückruf auf eine UI-Komponente erhalten. Ich empfehle, dass Sie diesen Aufruf mit einem BackgroundWorker durchführen, da dies dem UI-Thread bewusst ist.
Für den BackgroundWorker sollte das Hauptprogramm als [STAThread] gekennzeichnet sein.
Sie können dies auch versuchen
// 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();
Markieren Sie Ihr Programm einfach mit dem [STAThread]
-Attribut und der Fehler verschwindet! es ist Magie :)
Für mich trat dieser Fehler auf, weil ein Nullparameter übergeben wurde. Die Überprüfung der Variablenwerte hat mein Problem behoben, ohne den Code ändern zu müssen. Ich habe BackgroundWorker verwendet.