Ö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.
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 ç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: