Utas panggilan harus STA, karena banyak komponen UI memerlukan ini

174

Saya menggunakan http://www.codeproject.com/KB/IP/Facebook_API.aspx

Saya mencoba memanggil XAML yang dibuat menggunakan WPF . Tapi itu memberi saya kesalahan:

Utas panggilan harus STA, karena banyak komponen UI memerlukan ini.

Saya tidak tahu harus berbuat apa. Saya mencoba melakukan ini:

FacebookApplication.FacebookFriendsList ffl = new FacebookFriendsList();

Tapi itu memberi saya kesalahan itu.

Saya menambahkan pekerja latar belakang:

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...
}
C ..
sumber

Jawaban:

222

Cobalah untuk memanggil kode Anda dari dispatcher :

Application.Current.Dispatcher.Invoke((Action)delegate{
      // your code
});
Amjad Abdelrahman
sumber
Yeahhh, kalian menyelamatkan hidupku !!
Alex McManns
11
Inilah jawaban sebenarnya . Anda dapat meretas kebodohan jendela WPF dengan ini.
Andrew
7
Dan mirip dengan ini, jika Anda menggunakan MVVMLight, Anda dapat menggunakanDispatcherHelper.CheckBeginInvokeOnUI(Action action)
TimothyP
Masalah ini terlihat rumit & frustrasi tetapi tembakan ini sangat keren! Terima kasih banyak !
Kay Lee
4
@Andrew Ini bukan kebodohan, Anda hanya mencoba mengakses ke utas UI dari utas latar belakang.
Krusty
139

Jika Anda melakukan panggilan dari utas utama, Anda harus menambahkan atribut STAThread ke metode Utama, seperti yang dinyatakan dalam jawaban sebelumnya.

Jika Anda menggunakan utas terpisah, ia harus berada dalam STA (apartemen utas tunggal), yang tidak berlaku untuk utas pekerja latar belakang. Anda harus membuat utas sendiri, seperti ini:

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

t.Start();

dengan ThreadProc menjadi delegasi dari tipe ThreadStart.

Timores
sumber
2
dapatkah ini (menggunakan STA) mungkin memiliki efek samping?
Louis Rhys
10
Efek samping utama dari menjadi STA adalah bahwa callback COM simultan diserialisasi. Jika Anda tidak menggunakan COM callback, itu tidak masalah.
Timores
Menyelamatkan hidupku! Mampu menggunakan ini di aplikasi WPF yang meng-host API lokal untuk integrasi antara dua aplikasi yang berbeda!
schizoid04
18

Anda juga dapat mencoba ini

// 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();  
atik sarker
sumber
Terima kasih. Ini akan membantu ketika menggunakan kelas Applicationcontext bukan Form.
SaddamBinSyed
Saya membuka formulir baru ketika tombol diklik seperti yang saya lakukan di banyak tempat lain. Adakah yang tahu mengapa hanya satu dari tempat-tempat itu yang melempar kesalahan ini?
Paul McCarthy
17

Saya menduga bahwa Anda menerima panggilan balik ke komponen UI dari utas latar belakang. Saya sarankan Anda melakukan panggilan itu menggunakan BackgroundWorker karena ini adalah UI thread aware.

Untuk BackgroundWorker, program utama harus ditandai sebagai [STAThread].

Praha Sangha
sumber
1
Saya mencoba menambahkannya, seperti di atas, tetapi masih memberi saya kesalahan: /
C ..
Saya tidak familliar dengan kode tersebut. Bisakah Anda men-debug dan mengetahui persis garis kode yang menyebabkan ini?
Preet Sangha
3

Tandai saja program Anda dengan [STAThread]atribut dan kesalahan hilang! itu sihir :)

LiRoN
sumber
1

Bagi saya, kesalahan ini terjadi karena parameter nol dilewatkan. Memeriksa nilai variabel memperbaiki masalah saya tanpa harus mengubah kode. Saya menggunakan BackgroundWorker.

Ryan Loggerythm
sumber
-3

Jika Anda memanggil pernyataan UI jendela baru di utas yang sudah ada, itu menimbulkan kesalahan. Alih-alih itu buat utas baru di dalam utas utama dan tulis pernyataan UI jendela di utas anak baru.

Balvant Ramani
sumber
bagaimana cara menulis tolong jelaskan?
Tushar Gupta - curioustushar