Frage

Wir haben ein sehr kniffliges Interop-Problem, bei dem der Faden, der zum Initialisieren eines Drittanbietersystems verwendet wird, derselbe Thread sein muss, der zum Beenden verwendet wird. Wenn dies nicht der Fall ist, führt dies zu einem Deadlock. Wir führen Interop von einem in IIS gehosteten WCF-Service aus. Derzeit erfolgt diese Bereinigung in der Entsorgung und funktioniert normalerweise sehr gut. Unglücklicherweise lässt sich unter schwerer Last unhöflich entladen, und wir können niemals entsuden. Wir können die Herunterfahren-Logik in einen kritischen Finalizer verschieben, aber das hilft nicht, da wir nicht mehr Zugriff auf den Initialisierungsfaden haben! An dieser Stelle scheint unser einziger Rückgriff, dass der CLR die CLR benachrichtigt, dass die AppDomain nun wahrscheinlich in einem beschädigten Zustand ist. Ich bin jedoch nicht sicher, wie ich das tun soll (oder wenn es sogar möglich ist). Es kann sein, dass dies der Nutzen von Verträgen auf einer Klassenebene ist, aber ich gebe zu, dass ich das nicht wirklich verstehe.

edit: Alternativ kann dies als Thread Affinity-Problem im Finalizer betrachtet werden. Wenn jemand eine clevere Lösung dafür hat, bin ich alle Ohren :)

War es hilfreich?

Lösung

Versuchen Sie, den Code aufzuteilen, der von dieser nativen Abhängigkeit von einer eigenständigen Windows-Dienstanwendung abhängt, wenn möglich.Wenn es nicht gut mit WCF / IIS funktionieren kann, sollten Sie die Konflikte vermeiden, anstatt dagegen zu kämpfen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top