私は http://www.codeproject.com/KB/IP/Facebook_API.aspx を使用しています
XAML を呼び出しようとしていますが、これは WPF を使用して作成されます。しかし、それは私にエラーを与えます:
多くのUIコンポーネントがこれを必要とするため、呼び出しスレッドは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...
}
dispatcher からコードを呼び出してみてください:
Application.Current.Dispatcher.Invoke((Action)delegate{
// your code
});
メインスレッドから呼び出しを行う場合、前の回答で述べたように、STAThread属性をMainメソッドに追加する必要があります。
別のスレッドを使用する場合は、バックグラウンドワーカースレッドの場合ではない、STA(シングルスレッドアパートメント)にある必要があります。次のように、自分でスレッドを作成する必要があります。
Thread t = new Thread(ThreadProc);
t.SetApartmentState(ApartmentState.STA);
t.Start();
threadProcは、ThreadStart型のデリゲートです。
バックグラウンドスレッドからUIコンポーネントへのコールバックを取得していると思われます。これはUIスレッドに対応しているため、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();
プログラムを[STAThread]
属性でマークするだけで、エラーは消えます!魔法です :)
私にとって、このエラーはnullパラメーターが渡されたために発生しました。変数値を確認することで、コードを変更せずに問題を解決できました。 BackgroundWorkerを使用しました。