2008-09-04 13 views
1

IIS6'da barındırılan web hizmetimizde kullanılan bir üçüncü taraf dll'si var. Sorun şu ki, bu dll belleğe yüklendiğinde, AccessViolationException istisnası farklı bir iş parçacığı farklıysa, o zaman dll içinde herhangi bir kodu çalıştırmaya çalışır. Çalışan işlemi çok iş parçacıklı ve web servisine yapılan her çağrı havuzdan rastgele bir iş parçacığı alacak. Onu bellekten boşaltmaya ve ihtiyacımız olan her defasında yeniden yüklemeye çalıştık, ama sanırım sadece ön uç. Net ve geri kalanı yönetilemediğinden, bellekten asla tamamen boşaltılamaz. VB ve .NET 2.0 kullanıyoruz. Baska öneri?IIS'de aynı iş parçacığı kod yürütmek için nasıl kullanılır?

(Rob Walker Yanıt)

Biz yeni bir iş parçacığı oluşturma ve dll aramaya kullanmadan düşündü, ama nasıl iplik sit yapmak ve aramalar için beklemek yok

? Dispatcher sınıfının .Net 3.0 tarafından tedarik edilmesine gerek kalmadan aramayı nasıl temsil edersiniz? Gizli bir form oluşturmak ve onu mesaj döngüsüne koymak işe yarayabilir. Ve sonra formun Invoke() yöntemini çağırabiliriz. Ancak, IIS tarafından barındırılan bir web hizmetinde bir form oluşturduğumuzda ortaya çıkan birçok sorunu görebiliyorum.

cevap

1

Dispatcher adı verilen bir 3.0 adında bir sınıfı okudum, böylece bir iş parçacığına bir iş parçacığı yerleştirmenize izin verir ve sonra iş parçacığı kullanarak bir yöntemi yürütmek için bir temsilci kullanarak Invoke() yöntemini çağırır. Ancak .Net 3.0'a güncelleştiremiyorsanız bu çözüm çalışmaz. Başka bir çözüm ise üçüncü parti dll'yi sunucudaki başka bir uygulamada barındırmak ve ona erişmek için bir çeşit Remoting kullanmaktır. Ancak yine de, IIS'ye benzer davranması ve kodu yürütmek için rastgele bir iş parçacığı seçmesi nedeniyle, yine de Remoting'de bir sorununuz olabilir. Bunu aşmak için, dll'nin etrafına bir sarıcı yerleştirebilir ve formun Invoke() yöntemini kullanarak UI iş parçacığına çağrıları devretmek için kullanabilirsiniz.

1

DLL'ye yapılan tüm çağrıları işleyen ve serileştirme işlemlerini gerçekleştiren bir sarmalayıcı iş parçacığı kullanmanız gerektiğini düşünüyorum.

Bu iş parçacığı, yönetilen iş parçacığı havuzunun dışında olduğundan, ömrünü denetlersiniz. Ancak, IIS'nin web hizmetinizin bulunduğu uygulama etki alanını yeniden başlatmasını engelleyemediğiniz sürece bu bile sorunsuz olmazdı.

Ayrıca iki web hizmeti isteği aynı anda geldiğinde ne olacağı konusunda endişelenmeniz gerekir. Her arama DLL'ye bağımsız mı, yoksa başka bir isteğin hizmete girmesine izin vermeden önce tek bir web hizmeti isteği ile ilişkili tüm çağrıları gruplandırmanız mı gerekiyor?

0

Ek DLL'yi barındıran bir hizmet oluşturabilirsiniz. Hizmete eriştiğinizde, bu, çağrıları DLL'yi yöneten iş parçacığını gönderir.

Bu şekilde DLL'yi çağıran iş parçacığı üzerinde ve iş parçacığının ömrü boyunca denetiminiz vardır.

0

Biraz paslıyım, ancak çağrıları tek bir iş parçacığı COM nesnesinde DLL'ye sarmalamayı deneyebilirsiniz. Bu, tüm çağrıların COM nesnesinin windows ileti dizisinden geçmesini sağlar. Bunu yapmak için bileşeni Bileşen Hizmetleri içindeki bir sunucu uygulamasında kaydetmeniz gerektiğini düşünüyorum.

0

Farklı iş parçacıkları içinde dll'yi farklı örneklerde çalıştırabilir misiniz? Iş parçacığı1, bu üçüncü tarafın dll örneğini oluşturur ve iş parçacığı2 de yapar, ancak iş parçacığı1 iş parçacığının örneğini kullanmaya çalışmadığı sürece, bu özel durumu alamaz mı? Eğer durum buysa, .Net hiçbir zaman yüklendikten sonra herhangi bir kodu kaldırmaz, eğer bir derleme yükler ve sonra kaldırırsanız, hala o uygulama havuzunda oturur. Aynı anda birden fazla örnek oluşturabilirseniz, bir istek başına kontrol ettiğiniz ayrı bir uygulama havuzuna yükleyebilir ve ardından uygulama havuzunu kaldırabilirsiniz. Performans düşebilir.

İlgili konular