ฉันกำลังเรียนรู้ C # 3.5 และฉันต้องการทราบว่า[STAThread]
ในโปรแกรมของเรามีอะไรบ้าง
ฉันกำลังเรียนรู้ C # 3.5 และฉันต้องการทราบว่า[STAThread]
ในโปรแกรมของเรามีอะไรบ้าง
คำตอบ:
STAThreadAttribute
เป็นหลักจำเป็นสำหรับการปั๊มข้อความ Windows ที่จะสื่อสารกับส่วนประกอบของ COM แม้ว่า Windows Forms หลักจะไม่ใช้ COM แต่ส่วนประกอบหลายอย่างของระบบปฏิบัติการเช่นกล่องโต้ตอบระบบจะใช้เทคโนโลยีนี้
MSDNอธิบายเหตุผลในรายละเอียดเพิ่มเติมเล็กน้อย:
STAThreadAttribute บ่งชี้ว่าแบบจำลองเธรด COM สำหรับแอปพลิเคชันเป็นอพาร์ทเมนต์แบบเธรดเดี่ยว แอ็ตทริบิวต์นี้ต้องแสดงอยู่ที่จุดเริ่มต้นของแอปพลิเคชันใด ๆ ที่ใช้ Windows Forms หากไม่ได้ระบุองค์ประกอบของ Windows อาจทำงานไม่ถูกต้อง หากไม่มีแอตทริบิวต์แอปพลิเคชันจะใช้โมเดลอพาร์ตเมนต์แบบมัลติเธรดซึ่งไม่รองรับ Windows Forms
โพสต์บล็อกนี้ ( ทำไมต้องมีสถานะของข้อความ? ) ยังอธิบายความต้องการได้ค่อนข้างดี หากคุณต้องการมุมมองเชิงลึกเพิ่มเติมเกี่ยวกับวิธีการทำงานของเธรดรุ่นที่ระดับ CLR ดูบทความ MSDN Magazine ฉบับนี้ตั้งแต่เดือนมิถุนายน 2004 (เก็บถาวร, เมษายน 2009)
มันบอกคอมไพเลอร์ว่าคุณอยู่ในแบบ Single Thread Apartment นี่คือสิ่ง COM ชั่วมันมักจะใช้สำหรับ Windows Forms (GUI's) เป็นที่ใช้ Win32 สำหรับรูปวาดของมันซึ่งถูกนำมาใช้เป็น STA หากคุณกำลังใช้บางอย่างที่เป็นรุ่น STA จากหลายเธรดคุณจะได้รับวัตถุที่เสียหาย
นี่คือเหตุผลที่คุณต้องเรียกใช้ Gui จากเธรดอื่น (ถ้าคุณทำการเข้ารหัสรูปแบบใด ๆ )
โดยพื้นฐานแล้วไม่ต้องกังวลกับมันเพียงแค่ยอมรับว่าเธรด Windows GUI ต้องทำเครื่องหมายว่าเป็น STA ไม่เช่นนั้นจะเกิดเรื่องประหลาดขึ้น
STAThreadAttribute ทำเครื่องหมายเธรดเพื่อใช้อพาร์ทเมนต์ COM แบบเธรดเดียวถ้าจำเป็นต้องใช้ COM โดยค่าเริ่มต้น. NET จะไม่เริ่มต้น COM เลย มันก็ต่อเมื่อจำเป็นต้องใช้ COM เช่นเมื่อวัตถุ COM หรือการควบคุม COM ถูกสร้างขึ้นหรือเมื่อจำเป็นต้องใช้การลาก 'n' แล้ว COM นั้นจะถูกเตรียมใช้งาน เมื่อเกิดเหตุการณ์ดังกล่าวขึ้น. NET จะเรียกใช้ฟังก์ชัน CoInitializeEx พื้นฐานซึ่งรับค่าสถานะเพื่อระบุว่าจะเข้าร่วมเธรดไปยังอพาร์ตเมนต์แบบมัลติเธรดหรือเธรดเดี่ยว
อ่านข้อมูลเพิ่มเติมได้ที่นี่ (เก็บถาวร, มิถุนายน 2009)
และ
[STAThread]
?