2008-11-06 15 views
6

Aşağıdaki temel mimariye sahip bir uygulamam var:.NET remoting çağrıları nasıl hata ayıklanır?

Uzaktan erişim için .NET türünü (RemoteObject) kaydeden bir windows hizmeti (Service) (.NET Remoting). RemoteObject, IO işlemek için ThreadPool kullanan ThreadPool olmayan iş parçacığı oluşturur. ThreadPool'un boyutu belirli bir nedenden dolayı bir sınırla sınırlandırılmalıdır. Bir GUI uygulaması, RemoteObject öğesine erişmek için .NET Remoting'i kullanır.

Ben ThreadPool'da boyutu çok düşükse RemoteObject için arama yaparken, GUI uygulaması askıda fark ettik.

Sorum bu asılı neden anlamaya nasıl olduğunu ve neden RemoteObject iplik ThreadPool'da etkilenecek ki?

Bu beni deli ediyor; yardımın için teşekkürler!

+0

"RemoteObject, IO işlemek için ThreadPool'u kullanan ThreadPool olmayan iş parçacıkları oluşturur" diyorsunuz. Nedeni bu olamaz (yani ThreadPool parçacıkları açmak için ThreadPool yuvaları bekliyoruz)? – Alan

+0

Neden RemoteObject öğesinin açık olduğu iş parçacığını etkiler? GUI, çağırdığı RemoteObject yöntemine bile giremiyor. – Chris

+0

Bunu sallayabilirseniz, WCF için hendek atmayı deneyin. – Will

cevap

4

.NET remoting altyapısının .NET ThreadPool'u kullandığı ortaya çıkıyor (veya temel kaynağı paylaşıyor), böylece tüm ThreadPool parçacıkları uygulamanız tarafından kullanılıyorsa, bu çağrıları bekletebilirsiniz.

2

Bu son derece yararlı olmayabilir, ancak yine de oraya atacağım. müşteri için bir tane ve hizmet için bir tane: remoting üzerinden konuşmak hizmetleri ve müşterileri ayıklarken

, genellikle hep debugger'ın iki örneğini çalışacaktır. Sadece açık olmak gerekirse, iki kopya görsel stüdyo çalışıyorum. Servis için bağlantı komutunu kullanabilir veya ana ve çağrı başlangıçlarını doğrudan değiştirebilirsiniz (tüm servis kodlarını atlayarak). İşte

Genellikle, sen, gerçekten başlangıç ​​çağıran bir giriş noktası adildir ve servise DebugService çağrısı gerekecek ana değiştirerek ayıklamayı etkinleştirmek nasıl. Bunu bir kez yaptıktan sonra hizmet hata ayıklamasını SERVICE_DEBUG tanımlayarak ya da !' ekleyerek #if değiştirerek etkinleştirdim. Artık temel olarak hizmetinizi bir konsol uygulamasına dönüştürdünüz.

#if SERVICE_DEBUG 
      ServiceHost s = new ServiceHost(); 
      s.DebugService(); 
      Thread.Sleep(300000000); 

#else 
      ServiceBase.Run(ServicesToRun); 
#endif 

Kurulumu ve uzak çağrıları size aynı anda hem ayıklamak için izin, hizmet kod boyunca adım hizmetini vurduğunda sen, istemci üzerinden adım atabilirsiniz çalışan hem sahip olduktan sonra.

Meraktan çıkma uzaktaki nesneyi doğrudan GUI dizisinden mi arıyorsun? Eğer öyleyse, GUI iş parçacığı, yeniden başlatma çağrısı tamamlanıncaya kadar engellenir. Bu, tüm GUI'yi kilitler ve yanıt vermez hale getirir. Bu, sorunun çözümü değildir, ancak bu durumda ve hizmet iş parçacığınız dönmüyorsa, GUI'nin de askıda kalmasına neden olur.

+0

! Gerçekten iyi değil, onu değiştireceğinden, bir 'n' ile daha iyi öneki. – leppie

4

bu (bu senin sorunun olup olmadığını söyleyemem) yardımcı olacaktır eğer emin değilim, ama onun çalışıyor olarak hizmet hata ayıklamak istiyorsanız, kodunuzda bu tokat:

#if DEBUG 
      if (!System.Diagnostics.Debugger.IsAttached) 
       Debugger.Launch(); 
#endif 

ve bir hata ayıklayıcı seçmenizi isteyen bir iletişim kutusu alırsınız. Bir servisin çalışan örneğine eklenmesinin kolay bir yolu. Başka bir şey yoksa, bu, UI askıya alındığında (hata ayıklama araç çubuğunuzdaki duraklatma düğmesine basarak) hizmetinize girmenize ve iş parçacığınıza ve aramalarınıza bakmanıza izin verir.

+0

Asker problemim yok ama bu çözüm bana çok yardımcı oldu. :) – rythos42

1

Birkaç yıl önce, .NET Remoting'i kullanan kritik bir iş sistemi tasarladım ve uyguladım. Windows Forms GUI, Windows Hizmeti olarak uygulanan bir sunucu ve bir SQL Server veritabanı olarak uygulanan bir müşterimiz vardı.

Ben giderme/ayıklama/geliştirme için tasarlanmış

, benim ilk tasarım kriterlerinin nedenle bir ben trivially tüm .NET Remoting uygulanmasını kaldırıp masaüstümde bütün sistemi çalıştırabilir olmasıydı. Böylece, tek bir boolean yapılandırma ayarını "false" = kapalı olarak değiştirerek remoting'i devre dışı bırakabilirim.Sonra, .NET Remoting'in genel gider ya da paraziti olmadan tamamen sorun giderebilir, hata ayıklayabilir, geliştirebilirim.

Durumunuz için de bu değerli olabilir. Nitekim, özellikle uygulanması kolay olduğundan, bunun istenen bir özellik olmadığı bir durum düşünemiyorum. Bu nedenle, uygulamak için, yapılandırma ayarını, her bir istemci ve sunucu kodu tarafından, hangi uygulama sınıfının diğer tarafla iletişim kurmak üzere başlatılacağına karar vermek için kullandığını. Tüm iletişim, her iki tarafta iki somut uygulama sınıfına sahip olan özel bir C# arayüzü ile gerçekleşti: Bir sınıf, .NET Remoting kullanarak iletişimi uyguladı, diğer sınıf iletişimi doğrudan süreç içi geçiş (doğrudan çağrılar) olarak uyguladı.

Sadece bir çift sınıf (her bir tarafta bir tane) .NET Remoting hakkında bir şey biliyordu, bu nedenle yalıtım toplamdı. Çoğu zaman, tüm geliştiriciler, daha hızlı ve daha basit olan uzaklaştırma ile çalıştı. İhtiyaç duyduklarında, nadiren de olsa, (çoğunlukla sadece ben, ya da birisi sorun giderme için test/prodüksiyona bağlandığında) onu açtılar. Bu arada

, ben uzak arayüz ölü basit yaptı: kamu Tepki yürütmek (İstek) Bunun ötesinde

, ben de ucu yukarıda belirtilen fırlatma ayıklayıcısını kullanılan ve senin dikkatli olmak gerekir konusunda hemfikir GUI iş parçacığına etkisi.

İlgili konular