25. juli 2006 - 12:01Der er
9 kommentarer og 1 løsning
Duplicate shared instance in memory
Jeg er ved at lave en service og en klient dertil, dette fungerer som det skal nu. Hvis jeg genstarter min service fungerer det stadigvæk, de fleste af gangene, men ca 3-4 procent af gangene, sker der en mystisk fejl, klienten får ikke de data tilbage den skal have.
(Servicen indlæser filer der ligger i en mappe, og beholder så filinformationerne i en Shared instance af et object jeg selv har lavet. Dette er gjort for at det kun er servicen der en gang imellem skal kigge på filsystemet, hvor klienten, så bare spørger efter servicens oplysninger om filerne i hukommelsen.)
Jeg har prøvet at debugge mig frem til problemet, og når klienten spørger efter filoplysningerne, så er arraylisten med filoplysninger tom, men hvis jeg standser et kald til en anden metode som servicen anvender, så ligger der 8 filoplysninger i arraylisten. (disse 2 kald sker under samme runtime af servicen) Så umiddelbart kigger de i 2 forskellige instanser i hukommelsen, jeg kan bare ikke helt forstå hvorfor. Mit bedste gæt er, at det sker når man genstarter servicen imens klienten har fat i den sharede instans, og den så ikke bliver slettet, og computeren så derfor beholder den sharede instans i hukommelsen. og opretter nr 2 sharede instans når servicen starter op igen. Men det er jo kun spekulationer. Er der nogen der har kvalifikationer nok, til at lede mig på rette spor?
Nu kommer jeg med et long shot, for jeg ved meget lidt om services.
Jeg lavede for et stykke tid siden en COM+ service, og for at kalde det samme object i stedet for et nyt hver gang, skulle jeg have attributten Transaction på min klasse der blev kaldt på:
[CODE] using System.EnterpriseServices;
[Transaction(TransactionOption.Required)] public class ComCommunicator : ServicedComponent { private static int callNumber = 1;
public ComCommunicator(){}//constructor
public string DoTrans() { return "Kald nr " + callNumber++; } } [/CODE]
ServicedComponent er den klasse man nedarver fra for at lave et COM+ service klasse.
Metoden DoTrans() kaldte jeg som test fra et simpelt vbscript:
[SCRIPT] Set o = createobject("FunkiCommunicator.COMCommunicator") MsgBox o.DoTrans() MsgBox o.DoTrans() [/SCRIPT]
Når jeg kørte scriptet flere gange, blev den ved med at tælle op, når attributten var på. Når den ikke var på, talte den kun til 2 ved alle kørsler af scriptet.
Anyway så tror jeg du skal have fat i de rigtige attributter, men eftersom jeg ikke er en haj til det, skal der nok flere på banen for at hjælpe dig.
Jeg laver dog synclock på arraylister når der hentes og skrives til dem, for at skabe threadsafe arraylists, hvis det kan have noget at skulle have sagt.
piv, nå problemet opstår sjældent, så må jeg bare håbe at det ikke kommer og bider mig i nummeren.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.