[STAThread] ทำอะไรได้บ้าง


293

ฉันกำลังเรียนรู้ C # 3.5 และฉันต้องการทราบว่า[STAThread]ในโปรแกรมของเรามีอะไรบ้าง

คำตอบ:


240

STAThreadAttributeเป็นหลักจำเป็นสำหรับการปั๊มข้อความ Windows ที่จะสื่อสารกับส่วนประกอบของ COM แม้ว่า Windows Forms หลักจะไม่ใช้ COM แต่ส่วนประกอบหลายอย่างของระบบปฏิบัติการเช่นกล่องโต้ตอบระบบจะใช้เทคโนโลยีนี้

MSDNอธิบายเหตุผลในรายละเอียดเพิ่มเติมเล็กน้อย:

STAThreadAttribute บ่งชี้ว่าแบบจำลองเธรด COM สำหรับแอปพลิเคชันเป็นอพาร์ทเมนต์แบบเธรดเดี่ยว แอ็ตทริบิวต์นี้ต้องแสดงอยู่ที่จุดเริ่มต้นของแอปพลิเคชันใด ๆ ที่ใช้ Windows Forms หากไม่ได้ระบุองค์ประกอบของ Windows อาจทำงานไม่ถูกต้อง หากไม่มีแอตทริบิวต์แอปพลิเคชันจะใช้โมเดลอพาร์ตเมนต์แบบมัลติเธรดซึ่งไม่รองรับ Windows Forms

โพสต์บล็อกนี้ ( ทำไมต้องมีสถานะของข้อความ? ) ยังอธิบายความต้องการได้ค่อนข้างดี หากคุณต้องการมุมมองเชิงลึกเพิ่มเติมเกี่ยวกับวิธีการทำงานของเธรดรุ่นที่ระดับ CLR ดูบทความ MSDN Magazine ฉบับนี้ตั้งแต่เดือนมิถุนายน 2004 (เก็บถาวร, เมษายน 2009)


1
ความคิดว่าทำไม CompactFramework ไม่สนับสนุน[STAThread]?
bvdb

1
stackoverflow.com/questions/4154429/apartmentstate-for-dummiesคำตอบนี้เข้าใจได้ง่ายสำหรับปุถุชนอย่างฉัน เพิ่มเพื่อการอ้างอิงที่นี่เท่านั้น
Barış Akkurt

41

มันบอกคอมไพเลอร์ว่าคุณอยู่ในแบบ Single Thread Apartment นี่คือสิ่ง COM ชั่วมันมักจะใช้สำหรับ Windows Forms (GUI's) เป็นที่ใช้ Win32 สำหรับรูปวาดของมันซึ่งถูกนำมาใช้เป็น STA หากคุณกำลังใช้บางอย่างที่เป็นรุ่น STA จากหลายเธรดคุณจะได้รับวัตถุที่เสียหาย

นี่คือเหตุผลที่คุณต้องเรียกใช้ Gui จากเธรดอื่น (ถ้าคุณทำการเข้ารหัสรูปแบบใด ๆ )

โดยพื้นฐานแล้วไม่ต้องกังวลกับมันเพียงแค่ยอมรับว่าเธรด Windows GUI ต้องทำเครื่องหมายว่าเป็น STA ไม่เช่นนั้นจะเกิดเรื่องประหลาดขึ้น


2
STAThread ไม่มีส่วนเกี่ยวข้องกับข้อกำหนดในการเรียกใช้เธรดหลักเมื่อเข้าถึง GUI นี่เป็นเพียงลักษณะของปั๊มข้อความ Windows และไม่สามารถหลีกเลี่ยงได้โดยทั่วไปในแอพพลิเคชั่นแบบมัลติเธรด
Noldorin

3
จริงๆแล้วมันเกี่ยวกับการจัดการกับคอมโพเนนต์ COM เช่นกล่องโต้ตอบ OS และคอมโพเนนต์ของบุคคลที่สามเท่านั้น
Noldorin

3
Win32 ไม่มีแนวคิดเกี่ยวกับการทำอพาร์ทเมนท์เกลียวซึ่งเป็น COM ซึ่งแนะนำแนวคิดนี้ COM "re-task" สิ่งที่เป็นระบบที่ไม่เชื่อเรื่องพระเจ้าทั้งหมด (ปั๊มข้อความ windows) เป็นวิธีในการประสานการดำเนินการรหัส / อนุกรมใน COM พาร์ทเมนท์
AnthonyWJones

1
เพียงยอมรับว่า windows gui theads ต้องถูกทำเครื่องหมายว่าเป็น STA ไม่เช่นนั้นจะมีสิ่งแปลก ๆ เกิดขึ้น :))))))
Nipuna

1
@Noldorin "ความต้องการที่จะเรียกหัวข้อหลัก" - นี่คือไม่ได้ในทางเทคนิคความต้องการ ข้อยกเว้นข้ามเธรดไม่เกิดขึ้นนอกดีบักเกอร์ Ref: stackoverflow.com/questions/3972727/… . ไม่ได้บอกว่าคุณไม่ควรแก้ปัญหานี้!
ชีฟ

31

STAThreadAttribute ทำเครื่องหมายเธรดเพื่อใช้อพาร์ทเมนต์ COM แบบเธรดเดียวถ้าจำเป็นต้องใช้ COM โดยค่าเริ่มต้น. NET จะไม่เริ่มต้น COM เลย มันก็ต่อเมื่อจำเป็นต้องใช้ COM เช่นเมื่อวัตถุ COM หรือการควบคุม COM ถูกสร้างขึ้นหรือเมื่อจำเป็นต้องใช้การลาก 'n' แล้ว COM นั้นจะถูกเตรียมใช้งาน เมื่อเกิดเหตุการณ์ดังกล่าวขึ้น. NET จะเรียกใช้ฟังก์ชัน CoInitializeEx พื้นฐานซึ่งรับค่าสถานะเพื่อระบุว่าจะเข้าร่วมเธรดไปยังอพาร์ตเมนต์แบบมัลติเธรดหรือเธรดเดี่ยว

อ่านข้อมูลเพิ่มเติมได้ที่นี่ (เก็บถาวร, มิถุนายน 2009)

และ

ทำไมต้องใช้ STATHread?

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.