Apa yang dilakukan [STAThread]?

293

Saya belajar C # 3.5 dan saya ingin tahu apa yang [STAThread]ada di program kami?

odiseh
sumber

Jawaban:

240

Pada STAThreadAttributedasarnya adalah persyaratan untuk pompa pesan Windows untuk berkomunikasi dengan komponen COM. Meskipun inti Windows Forms tidak menggunakan COM, banyak komponen OS seperti dialog sistem menggunakan teknologi ini.

MSDN menjelaskan alasannya dengan sedikit lebih detail:

STAThreadAttribute menunjukkan bahwa model threading COM untuk aplikasi adalah apartemen single-threaded. Atribut ini harus ada pada titik masuk aplikasi apa pun yang menggunakan Formulir Windows; jika dihilangkan, komponen Windows mungkin tidak berfungsi dengan benar. Jika atribut tidak ada, aplikasi menggunakan model apartemen multithreaded, yang tidak didukung untuk Formulir Windows.

Posting blog ini ( Mengapa diperlukan STAThread? ) Juga menjelaskan persyaratan dengan cukup baik. Jika Anda ingin tampilan yang lebih mendalam tentang bagaimana model threading bekerja di tingkat CLR, lihat artikel Majalah MSDN ini dari Juni 2004 (Archived, April 2009).

Noldorin
sumber
1
tahu mengapa CompactFramework tidak mendukung [STAThread]?
bvdb
1
stackoverflow.com/questions/4154429/apartmentstate-for-dummies jawaban ini cukup bisa dimengerti oleh manusia seperti saya. Ditambahkan hanya untuk referensi di sini
Barış Akkurt
41

Ini memberitahu kompiler bahwa Anda berada dalam model Apartemen Single Thread. Ini adalah hal COM yang jahat, biasanya digunakan untuk Windows Forms (GUI) karena menggunakan Win32 untuk menggambarnya, yang diimplementasikan sebagai STA. Jika Anda menggunakan sesuatu yang model STA dari beberapa utas maka Anda mendapatkan objek yang rusak.

Inilah sebabnya mengapa Anda harus memohon ke Gui dari utas lain (jika Anda telah melakukan pengkodean formulir apa pun).

Pada dasarnya jangan khawatir, terima saja bahwa utas Windows GUI harus ditandai sebagai STA jika tidak, hal-hal aneh terjadi.

Tempat menyimpan bahan makanan
sumber
2
STAThread tidak ada hubungannya dengan persyaratan untuk mengaktifkan utas utama saat mengakses GUI. Ini hanya karena sifat pompa pesan Windows, dan tidak dapat dihindari secara lebih umum dalam aplikasi multithreaded.
Noldorin
3
Sungguh, ini hanya tentang berurusan dengan komponen COM seperti dialog OS dan komponen pihak ketiga.
Noldorin
3
Win32 tidak mengusung konsep threading apartments, COM-nya yang memperkenalkan konsep tersebut. COM "menugaskan kembali" apa yang sepenuhnya merupakan sistem agnostik utas (pompa pesan windows) sebagai sarana untuk menyinkronkan / mengeksekusi kode serial di apartemen COM.
AnthonyWJones
1
Terima saja bahwa windows gui theads harus ditandai sebagai STA jika tidak, hal-hal aneh terjadi. :))))))
Nipuna
1
@Noldorin "persyaratan untuk mengaktifkan utas utama" - ini bukan persyaratan teknis . Pengecualian cross-thread tidak terjadi di luar debugger. Ref: stackoverflow.com/questions/3972727/… . Tidak mengatakan Anda tidak harus menyelesaikan masalah ini!
Shiv
31

STAThreadAttribute menandai utas untuk menggunakan Apartemen COM Single-Threaded jika COM diperlukan. Secara default, .NET tidak akan menginisialisasi COM sama sekali. Hanya ketika COM diperlukan, seperti ketika objek COM atau Kontrol COM dibuat atau ketika tarik 'n' drop diperlukan, COM diinisialisasi. Ketika itu terjadi.

Baca info lebih lanjut di sini (Diarsipkan, Juni 2009)

dan

Mengapa STAThread diperlukan?

rahul
sumber