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

Jawaban:


222

Cobalah untuk memanggil kode Anda dari dispatcher :

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

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.


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();  

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].


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 :)


1

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


-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.


bagaimana cara menulis tolong jelaskan?
Tushar Gupta - curioustushar
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.