Events der bliver væk

by Jesper august 27, 2009 12:37

Jeg sidder på en server applikation, der rejser en række events, som et ukendt antal klienter kan abonnerer på. Så begynder jeg pludselig at få periodiske fejl – der er klienter der ikke bliver notificeret når serveren rejser en event. Efter lang tids debugging, finder jeg frem til problemet. En af klienterne, smider en Exception i EventHandleren som den har føjet til observer listen (hooket op på eventen).

Per design fungerer MulticastDelegate således at den har en intern liste (invocationlist), som indeholder en reference til alle de eventhandlere der er tilføjet til den. Når man så f.eks. rejser eventen:

Change(this, EventArgs.Empty)

Så bliver hver enkelt eventhandler kaldt synkront fra en ende af. Hvis man så, som i mit tilfælde, har en af disse eventhandlere der smider en uhåndteret Exception, så stopper den sekventielle eksekvering af listen, og man kommer ikke videre.

Man skal altså sørge for at metoder der implementerer en delegate, på ingen måde kan smide en Exception. Men hvad nu hvis man ikke har styr på alle observanter, og ikke har mulighed for at sikre den kvalitet?

Jeg har forsøgt med følgende fejlsikre metode:

protected void OnChange(EventArgs args)
{
    foreach (EventHandler item in Change.GetInvocationList())
    {
        try
        {
            item.Invoke(this, args);            
        }
        catch(Exception){}
    }
}

Her bruger jeg MulticastDelegate.GetInvocationList() til at få en array af delegates der er registreret som lytterere på eventen, og kalder derefter hver delegate en efter en, og sikre mig at vi kommer videre selvom der sker fejl.

Det virker, og jeg er sluppet for fejl, men er det en ok løsning?

Kan man eventuelt udnytte samme princip til at udfører koden asynkront?

Altså bruge BeginInvoke i stedet for Invoke?

Det kræver flere tests, men jeg tror jeg har fat i noget…

Code on…

Tags:

C#

Kommentarerne er lukkede

Powered by BlogEngine.NET 1.5.0.7
Theme by Mads Kristensen | Modified by Mooglegiant

About

Mit navn er Jesper Jensen, og jeg arbejder til dagligt som web-udvikler hos DGI, hvor mit speciale er klientside applikationer. Før det var jeg nogle år i robotbranchen, hvor jeg arbejdede med 3D simulering og system koordinering. Jeg elsker webudvikling, og specielt JavaScript har min interesse. Jeg har blogget om mine oplevelser med udvikling siden 2004

Calendar

<<  juli 2010  >>
mationtofr
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

View posts in large calendar

RecentComments

Comment RSS