2010-10-07 12 views
6

Anladığım kadarıyla, STA olarak işaretlenmiş bir COM bileşeni bir MTA iş parçacığından kullanıldığında, çağrıların bir STA iş parçacığına dönüştürülmesi ve bu özel iş parçacığından yürütülmesi gerekir. Bir Windows istemci uygulaması söz konusu olduğunda, bu UI iş parçacığının üzerinde çalışacağı anlamına gelir (STA olarak işaretlenirse) ve COM bileşeninden gelen geri bildirimler, Windows iletileri tarafından gizli bir pencereye gönderilir ve işlenir. Windows ileti döngüsü.STA COM bileşenleri, IIS'de (7+) barındırılan bir WCF hizmetinde kullanıldığında nasıl kullanılır?

IIS'de barındırılan bir WCF hizmetinde STA COM bileşeni kullanırsam ne olur? Çalışan işlemin bir STA iş parçacığında Windows ileti döngüsü olacak mı? Kendi mesaj döngüsüyle kendi STA dizimi ekleyebilir miyim?

cevap

4

COM çalışma zamanı, bir STA içindeki COM nesnesindeki yöntem çağrılarının gönderilmesinden sonra görünür: bunun, Windows iletilerini göndermek için kullanılan aynı işletim sistemi mekanizmasına dayandığından eminsiniz, ancak endişelenmeniz gerekmez. Bunu yapmak - COM bunu başlığın altında yapıyor. endişelenecek ihtiyacını yapmak Ne

COM nesneleri yaşamak için gidiyoruz STA hangi. Bir WCF hizmetinden COM birlikte çalışabilirlik kullanarak parçacıklı COM nesneleri örneğini ise, dikkatli olmak gerekir.

Bunu yaptığınız iş parçacığı bir STA iş parçacığı değilse, tüm çalışan COM nesneleri, IIS çalışan işlemi için varsayılan Host STA içinde yaşayacaktır. Bunun olmasını istemezsiniz: tüm servis işlemleri için tüm COM nesneleriniz aynı STA'da sona erer. İpucu isminde bulunuyor - tüm nesneler için sadece bir iş parçacığı var - ve onların yöntemlerine yapılan tüm çağrılar, apartmandaki tek ve iş parçacığının onları yürütmesini bekleyecek şekilde serileştirilecek. Hizmetiniz eşzamanlı birden çok istemciyi işlemek için ölçeklenmeyecektir.

Belirli bir WCF isteğine hizmet vermek için başlattığınız COM nesnelerinin, diğer isteklerde oluşturulan nesnelerden ayrı olarak kendi STA'larında olduğundan emin olmanız gerekir. Belirli bir istek için COM nesne örneğini oluşturmak için hangi bunu başlamadan önce SetApartmentState() yılında ApartmentState.STA belirterek

  • Spin kadar kendi Konu,: Bunu yapmanın iki yolu geniş vardır. Bu, Scott Seely tarafından the link in Kev's answer'da ayrıntılı olarak anlatılan yaklaşımdır: her servis operasyon çağrısının yeni bir STA-başlatılmış Thread'de çalıştırılmasını sağlar. Bu hatlar boyunca daha zor ama daha ölçeklenebilir bir çözüm, tekrar kullanılabilir STA-başlatılmış İpliklerin bir havuzunu uygulamak olacaktır.
  • COM nesnelerini bir COM + uygulamasında barındırır, böylece ayrı bir DllHost işleminde yaşarlar, burada COM + (the Activity olarak adlandırılan soyutlama yoluyla) farklı isteklere yönelik nesnelerin farklı STA'lara yerleştirilmesiyle ilgilenebilir.

Geri aramalara başvurduğunuzda tam olarak ne demek istediğinizden emin değilim. Belki de COM yönteminin COM yöntemlerinin COM nesnesinin yöntemlerinden birine argüman olarak iletilen bir başvuru yoluyla yönetilen kodunuzda bazı COM arabirimlerinde çağrıldığı anlamına gelir: eğer öyleyse, bu sadece çalışmalıdır. Ama belki de başka bir şeyden bahsediyorsunuz, bu durumda belki de açıklığa kavuşturmak için soruyu değiştirebilirdiniz.

3

STA iş parçacığındaki iletileri WCF hizmetinde pompalamanız gerektiğini veya COM nesnesindeki geri çağrıları kaçırdığınızı buldum.

Aşağıdaki kod çalışır, ancak COM nesnesini bir Dispatcher aracılığıyla çağırmanızı gerektirir.Daha sonra aşağıdaki gibi çağrılar yapın.

public void UsefulComOperation() 
{ 
    localThreadDispatcher.Invoke(new Action(() => comWrapper.UsefulOperation); 
} 
+1

'localThreadFinished' ... bildiğim kadarıyla söyleyebilirim, hiçbir yerde tanımlanmamış' ThreadProc' üstündeki beyan etmek için niyet olarak, oldu 'AutoResetEvent localThreadFinished = (AutoResetEvent) O'? – transistor1

İlgili konular