FAQ |
Kalender |
2009-12-01, 17:21 | #1 | ||
|
|||
Medlem
|
Hej!
Jag håller på och utvecklas lite som programmerar och har börjat med att använda Events i .NET men får inte riktigt till det här. Jag ska ge ett exempel på vart det går fel. Jag har en klass som heter StaticPage med en Event som heter Saved som körs varje gång StaticPage uppdateras mot databasen. Eventen är deklarerad som Static/Shared Sen har jag en annan klass som heter CleanStaticPage som har en rutin som ser till att kontrollera så att StaticPage innehåller xhtml baserad kod, det körs in ett objekt för hela appen i Global.asax som Shared/Static. Den har en metod som ser ut så här: Public Class CleanStaticPage Public CleanXHTML(UpdatedPage As StaticPage) Handels StaticPage.Saved 'DoSomeStuff UpdatedPage.Save() End If End Class Vips så har jag gjort StackOverflow eftersom den senare rutinen ser till att uppdatera objektet och då triggar det sig själv igen. Jag försökte med att köra någon variant RemoveHandler UpdatedPage,AdressOf CleanXHTML och sen lägga till rutinen igen när uppdateringen var klar, men det funkar inte och jag får något warning-meddelande att koden är meningslös i sammanhanget. Jag skulle vilja veta hur man får något sånt här och fungera så man kan ignorera metoden som triggade eventen att köras igen. En vacker dag ska det vara så att det här körs med Multi Threadning. Antagligen har jag lite otur när jag tänker eftersom man säkert ska göra på ett smidigare sätt. Hela koden är bara påhitt för att illustrera exempel. |
||
Svara med citat |
2009-12-01, 19:38 | #2 | ||
|
|||
Flitig postare
|
Spontant så känns det lite fel med en massa statiska events, men.. Kan du publicera de delar av koden som är intressant? (Deklaration av events, anrop av events, addhandler osv)
|
||
Svara med citat |
2009-12-01, 20:23 | #3 | ||
|
|||
Medlem
|
Yes, här kommer lite kod som visar principen. Jag undrar om det går och låsa funktionen på något sätt så att den inte kan köras flera gånger, men det känns som en fullösning och sätta in någon typ utav Shared Variabel som håller koll på det, sen har jag varit inne på om det går och lösa med Threading ocskå
Public Class ListnerHandler Public Sub New() AddHandler HTMLPage.Saved, AddressOf CleanUp End Sub Public Sub CleanUp(ByVal Obj As CustomizedEventArgs) Obj.Sender.XHTML = "Fixed" Obj.Sender.Save() End Sub End Class Public Class HTMLPage Public Shared Event Saved(ByVal EA As CustomizedEventArgs) Protected Sub OnSaved() RaiseEvent Saved(New CustomizedEventArgs(Me)) End Sub Private _XHTML As String Public Property XHTML() As String Get Return _XHTML End Get Set(ByVal value As String) _XHTML = value End Set End Property Public Sub Save() ''' Do the magic OnSaved() End Sub End Class Public Class CustomizedEventArgs Inherits EventArgs Public Sender As HTMLPage Public Sub New(ByVal CurrentSender As HTMLPage) Sender = CurrentSender End Sub End Class |
||
Svara med citat |
2009-12-01, 22:13 | #4 | ||
|
|||
Medlem
|
Näe nu ger jag upp, jag får verkligen inte till det här, men jag antar att det kanske är lika dumt som att skriva som här nedanför. Men visar det sig ändå att det går och lösa så är jag tacksam för något förslag
Public Class Test Sub New() Dim T As New Test End Sub End Class |
||
Svara med citat |
2009-12-02, 19:04 | #5 | ||
|
|||
Flitig postare
|
Deklarera inte ditt event som shared/static. Gör istället så att man när man skapar din klass själv får haka på eventet med addhandler.
Pseudokod i C#: bool ignoreEvent = false; HtmlPage hp = new HtmlPage(); hp.Saved += new EventHandler(delegate(object sender, EventArgs e) { if(!ignoreEvent) { ignoreEvent = true; //Gör någonting } }); |
||
Svara med citat |
Svara |
|
|