WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   .NET köra Events som triggar en rutin (https://www.wn.se/forum/showthread.php?t=1039387)

ledstrom 2009-12-01 17:21

.NET köra Events som triggar en rutin
 
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.

Onkelborg 2009-12-01 19:38

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)

ledstrom 2009-12-01 20:23

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

ledstrom 2009-12-01 22:13

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

Onkelborg 2009-12-02 19:04

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
}
});


Alla tider är GMT +2. Klockan är nu 07:47.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson