web-dev-qa-db-ja.com

多くのUIコンポーネントがこれを必要とするため、呼び出しスレッドはSTAである必要があります

私は 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...
}
142
C..

dispatcher からコードを呼び出してみてください:

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

メインスレッドから呼び出しを行う場合、前の回答で述べたように、STAThread属性をMainメソッドに追加する必要があります。

別のスレッドを使用する場合は、バックグラウンドワーカースレッドの場合ではない、STA(シングルスレッドアパートメント)にある必要があります。次のように、自分でスレッドを作成する必要があります。

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

t.Start();

threadProcは、ThreadStart型のデリゲートです。

129
Timores

バックグラウンドスレッドからUIコンポーネントへのコールバックを取得していると思われます。これはUIスレッドに対応しているため、BackgroundWorkerを使用して呼び出しを行うことをお勧めします。

BackgroundWorkerの場合、メインプログラムは[STAThread]としてマークされる必要があります。

15
Preet Sangha

これを試すこともできます

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

プログラムを[STAThread]属性でマークするだけで、エラーは消えます!魔法です :)

1
LiRoN

私にとって、このエラーはnullパラメーターが渡されたために発生しました。変数値を確認することで、コードを変更せずに問題を解決できました。 BackgroundWorkerを使用しました。

0
Ryan Loggerythm