Bir STA üzerinde temel BIR konsol uygulaması, COM bileşenlerinin yayım gecikme ve çöp toplayıcısını toplayan nesneler Finalize yöntemlerini çağrıları geciktirebilir

Makale çevirileri Makale çevirileri
Makale numarası: 828988 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Belirtiler

Bir tek iş parçacıklı grup üzerinde (STA) temel alan bir konsol uygulaması oluşturur ve sonra da STA Bileşen Nesne Modeli (COM) bileşenlerini kullanır ve konsol uygulaması Monitor.Enter yöntemi Thread.Join yöntemini ve diğer arama gibi COM iletileri pump için yeterli operasyonları gerçekleştirmek aşağıdaki belirtilerden ortaya çıkabilir. Ayrıca, konsol uygulaması, uzun bir süredir çalıştırılan ve, iletileri Console.ReadLine yöntemini çağıran gibi pump işlemlerini gerçekleştirir aşağıdaki belirtilerden oluşabilir:
  • COM bileşenleri sürümü gecikebilir.
  • Çöp toplayıcısını toplayan nesneler Finalize yöntemlerini çağrıları gecikebilir.
  • COM bileşenleri çağrıları, uygulama iş parçacığında uzun süre engelleyebilir.
  • STA uygulama işlemi kullandığı bellek miktarı zaman içinde artabilir.
  • GC.WaitForPendingFinalizers yöntem çağrıları döndürmek için uzun zaman alabilir.

Neden

Bir STA COM bileşeni çağrısı, bileşen yayımlamayı dahil olmak üzere bir çağrı doğru teslim etmek için bileşen oluşturulduğu iş parçacığının iletileri pumping olması gerekir. Yönetilen kod artık bir COM bileşeni başvurduğunda, iş parçacığının finalizer bileşeni <a1>sürüm</a1> yöntemini çağırmalısınız. Bileşen oluşturulduğu iş parçacığının STA iletileri pumping, ancak çağrı blokları uygulama iş parçacığının kadar iletileri yeniden pumping başlar. Bazı uygulamalar, COM bileşenleri ve nesneleri aşamasındadır çok oluşturun. Bu uygulamalarda finalizer iş parçacığının lot harcadığı süre için STA beklerken engellendi pump iletileri için iş parçacığı, iş parçacığının finalizer, aktivite tamamlamak mümkün olabilir. Her iki listeyi COM bileşenleri sürüm ve sonlandırmasını yönetilen nesneleri listesi sonsuza kadar büyümesine. Bu sorun devam ederse, STA uygulama işlemi kullandığı bellek miktarı zaman içinde artabilir. Ayrıca, GC.WaitForPendingFinalizers yöntemini çağıran herhangi bir iş parçacığının süresiz olarak engelleyebilir.

ReadFile ve WriteFile, işletim sisteminin, dosya ve konsol giriş/çıkış (g/Ç) işlemleri iletileri pump. Işletim sistemi üzerinde ReadFile API Console.ReadLine olduğundan, Console.ReadLine pump iletileri değil ya da yapar. Bu nedenle, Console.ReadLine çağıran herhangi bir iş parçacığı iletileri çağrısı sırasında pump değil.

Çözüm

Bu sorunu gidermek için <a0></a0>, MTA iş parçacığı yerine STA iş parçacığı oluşturma ve konsol uygulamalarında COM bileşenleriyle iletişim kurmak için kullanın. Bir MTA için uygulamanın ana iş parçacığı ayarlayabilirsiniz. Bunu yapmak için <a0></a0>, System.MTAThread uygulamak için ana yöntemi, aşağıdaki öznitelik:
public class ConsoleApplication
             {
                 [MTAThread]
                 static void Main()
                 {
                     // Add your code here.
                     Console.ReadLine();
                 }
} 
STA iş parçacığı, COM bileşenleri oluşturmak için kullanmalısınız, iletileri düzenli olarak STA iş parçacığı pump gerekir. Iletileri kısa bir süre için pump Thread.Join yöntemi gibi aramak için: 100 milisaniye iletilerde bu yöntem çağrısı
Thread.CurrentThread.Join(100)
pumps. Zaman aşımı uygulamanın gereksinimlerine bağlı olarak ayarlayabilirsiniz. Ayrıca, STA iş parçacığı hiçbir zaman Console.ReadLine arama gibi sınırlandırılmamış olmayan pumping işlemleri gerçekleştirmelisiniz. Bunun yerine operasyonu gerçekleştirmek ve sonra işlemin bitmesini bekleyin bir MTA iş parçacığının STA iş parçacığı olması gerekir.

Referanslar


Microsoft .NET Framework remoting hakkında daha fazla bilgi için aşağıdaki Microsoft Web sitesini ziyaret edin:
http://msdn2.microsoft.com/en-us/library/1912sb9w(vs.71).aspx
.NET Framework atık toplama işlemi hakkında daha fazla bilgi için aşağıdaki Microsoft Web sitelerini ziyaret edin:
http://msdn.microsoft.com/msdnmag/issues/1100/gci/
http://msdn.microsoft.com/msdnmag/issues/1200/GCI2/

Bir <a0>STA</a0> bileşeninden çağrıları engelleme hakkında daha fazla bilgi için Microsoft Knowledge Base'deki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
291837BILGI: engelleyen bir <a0>STA</a0> bileşeninden çağrılarınızı değil

Özellikler

Makale numarası: 828988 - Last Review: 9 Şubat 2004 Pazartesi - Gözden geçirme: 1.4
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0
Anahtar Kelimeler: 
kbmt kbgarbagecollect kbremoting kbprb KB828988 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:828988

Geri Bildirim Ver

 

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