โปรแกรมประยุกต์คอนโซลที่สร้างขึ้นเป็น STA อาจประวิงรุ่นของคอมโพเนนต์ของ COM และอาจประวิงการเรียกวิธี Finalize ของออปเจ็กต์ที่รวบรวมตัวเก็บรวบรวมการขยะ

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 828988 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
ขยายทั้งหมด | ยุบทั้งหมด

อาการ

ถ้าโปรแกรมประยุกต์คอนโซลที่ใช้เป็นเธรดเดี่ยว apartment (STA) สร้าง และใช้คอมโพเนนต์ของแบบจำลองในวัตถุคอมโพเนนต์ STA (COM) แล้ว และแอพลิเคชันของคอนโซลไม่ทำการดำเนินการที่เพียงพอกับข้อความ pump COM เช่นโทรศัพท์นี้Monitor.Enterวิธีการ การThread.Joinเมธอด และอื่น ๆ อาการต่อไปนี้อาจเกิดขึ้นได้ นอกจากนี้ ถ้าแอพลิเคชันคอนโซลทำการดำเนินการ ที่ที่ทำงานเป็นเวลานาน และที่ไม่ปั๊มข้อความ เช่นโทรศัพท์นี้Console.ReadLineวิธี อาการต่อไปนี้อาจเกิดขึ้น:
  • รุ่นของคอมโพเนนต์ของ COM อาจถูกเลื่อนออก
  • โทรศัพท์ไปจบเขียนวิธีการของออปเจ็กต์ที่รวบรวมตัวเก็บรวบรวมการเบจอาจถูกเลื่อนออก
  • การเรียกไปยังคอมโพเนนต์ของ COM อาจบล็อกเธรดแอพลิเคชันสำหรับรอบระยะเวลาที่ขยายเพิ่มเติม
  • จำนวนของหน่วยความจำที่ใช้ในกระบวนการแอพลิเคชัน STA อาจเพิ่มเวลา
  • เรียกไปGC.WaitForPendingFinalizersวิธีอาจใช้เวลานานเพื่อย้อนกลับ

สาเหตุ

การจัดส่งการเรียกคอมโพเนนต์ของ STA COM อย่างถูกต้อง รวมทั้งการเรียกไปยังส่วนประกอบ การนำออกใช้เธรดที่สร้างคอมโพเนนต์ต้องถูกปั๊มข้อความ เมื่อได้รับการจัดการรหัสไม่อ้างอิงคอมโพเนนต์ของ COM ต้องเรียกเธรด finalizerรุ่นวิธีการของส่วนประกอบ อย่างไรก็ตาม ถ้า STA เธรดที่ถูกสร้างคอมโพเนนต์ที่ไม่ถูกปั๊มน้ำข้อความ บล็อกโทรแอพลิเคชันจนถึงเธรดเริ่มปั๊มน้ำข้อความอีกครั้ง โปรแกรมประยุกต์บางโปรแกรมสร้างจำนวนมากคอมโพเนนต์ของ COM และวัตถุที่สามารถ finalized ในโปรแกรมประยุกต์เหล่านี้ ถ้าหากว่าเธรด finalizer spends ล็อต เวลาที่ถูกบล็อกในขณะนั้นรอสำหรับ STA ในเธรดข้อความ pump เธรด finalizer อาจไม่สามารถดำเนินการของกิจกรรม รายการทั้งสองของ COM คอมโพเนนต์ย่อยและรายการของวัตถุที่ได้รับการจัดการการจบเขียนอาจขยาย indefinitely ได้ หากปัญหานี้เกิดขึ้น จำนวนหน่วยความจำที่ใช้ในกระบวนการแอพลิเคชัน STA อาจเพิ่มเวลา นอกจากนี้ เธรดใด ๆ ที่เรียกนั้นGC.WaitForPendingFinalizersวิธีอาจบล็อก indefinitely

แฟ้มและคอนโซลอินพุต/เอาท์พุต (IO) การดำเนินงานของระบบปฏิบัติการ เช่นreadfileและWriteFileไม่ปั๊มข้อความ เนื่องจากConsole.ReadLineอาศัย API ReadFile ของระบบปฏิบัติการConsole.ReadLineไม่ไม่ pump ข้อความอย่างใดอย่างหนึ่ง ดังนั้น เธรดใด ๆ ที่เรียกConsole.ReadLineไม่ปั๊มข้อความในระหว่างการเรียก

การแก้ไข

เมื่อต้องการแก้ไขปัญหานี้ ใช้เธรด MTA แทนของเธรด STA เพื่อสร้าง และ การสื่อสารกับคอมโพเนนต์ของ COM ในโปรแกรมประยุกต์ของคอนโซล คุณสามารถตั้งค่าเธรดหลักของแอพลิเคชันไปยัง MTA เมื่อต้องการทำเช่นนี้ ใช้System.MTAThreadคุณลักษณะการวิธีหลัก เป็นดังนี้:
public class ConsoleApplication
             {
                 [MTAThread]
                 static void Main()
                 {
                     // Add your code here.
                     Console.ReadLine();
                 }
} 
ถ้าคุณต้องใช้เธรด STA สร้างคอมโพเนนต์ของ COM เธรด STA ต้องปั๊มข้อความอย่างสม่ำเสมอ ข้อความ pump สำหรับช่วงเวลา เรียกสั้น ๆThread.Joinวิธี ดัง:
Thread.CurrentThread.Join(100)
วิธีนี้เรียกข้อความ pumps สำหรับมิลลิวินาที 100 คุณสามารถปรับการหมดเวลาที่ขึ้นอยู่กับความต้องการของแอพลิเคชัน นอกจากนี้ STA เธรดควรอย่าดำเนิน unbounded ไม่ปั๊ม เช่นโทรศัพท์Console.ReadLine. แทน เธรด STA ต้องมีเธรด MTA ดำเนินการ และรอการดำเนินการเสร็จสมบูรณ์แล้ว

ข้อมูลอ้างอิง


สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ Microsoft .NET Framework remoting แวะไปที่เว็บไซต์ต่อไปนี้ของ Microsoft:
.aspx http://msdn2.microsoft.com/en-us/library/1912sb9w (vs.71)
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับคอลเลกชันเบจใน.NET Framework แวะไปที่เว็บไซต์ต่อไปนี้ของ Microsoft:
http://msdn.microsoft.com/msdnmag/issues/1100/gci/
http://msdn.microsoft.com/msdnmag/issues/1200/GCI2/

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการบล็อกการเรียกจากคอมโพเนนต์ STA คลิกหมายเลขบทความต่อไปนี้เพื่อดูบทความในฐานความรู้ของ Microsoft:
291837ข้อมูล: ไม่ทำให้การเรียกจากคอมโพเนนต์ STA การบล็อค

คุณสมบัติ

หมายเลขบทความ (Article ID): 828988 - รีวิวครั้งสุดท้าย: 14 มกราคม 2554 - Revision: 2.0
ใช้กับ
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0
Keywords: 
kbgarbagecollect kbremoting kbprb kbmt KB828988 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:828988

ให้ข้อเสนอแนะ

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com