Har skrivit min första windows service som skall skriva till en .txt fil vid ett visst tillfälle: Jag är lite osäker där, men VB klarar väl inte real-time utan arbetar vid förfrågan. Lös det med javascript eller liknande som kallar på funktionen. Antar att OnStart är startmetoden på servicen som körs när servicen startar. Tack för svaret. Timer i servicen var allt jag behövde. Däremot finns bara Timer_Tick som event i windows projekt, när man gör service projekt heter det Timer_Elapsed. Angående min IF sats för datum kollen så funkar: Hej Hej,Windows service
<code>
Dim LastRunDate = Date
Protected Overrides Sub OnStart(ByVal args() As String)
' Add code here to start your service. This method should set things
' in motion so your service can do its work.
EventLog1.WriteEntry("In OnStart")
If Now.DayOfWeek = DayOfWeek.Wednesday And Not (LastRunDate.Year = Now.Year And LastRunDate.Month = Now.Month And LastRunDate.Day = Now.Day) And TimeString = "16:00:00" Then
'Do Stuff
Dim path As String = "C:\Inetpub\wwwroot\mulle.txt"
If File.Exists(path) = False Then
' Create a file to write to.
Dim sw As StreamWriter = File.CreateText(path)
sw.WriteLine("Hello")
sw.WriteLine("And")
sw.WriteLine("Welcome")
sw.Flush()
sw.Close()
EventLog1.WriteEntry("Skapade textfil")
End If
LastRunDate = Now
End If
End Sub
</code>
Porblemet är att den inte skriver till filen kl 16:00. Har provat att dimma ut IF satsen för tid/datum, och då skapas filen och skrivs till. Har det något med att med systemtiden att göra?Sv: Windows service
Sv: Windows service
<code>If Now.DayOfWeek = DayOfWeek.Wednesday And Not (LastRunDate.Year = Now.Year And LastRunDate.Month = Now.Month And LastRunDate.Day = Now.Day) And TimeString = "16:00:00" Then</code>
Om man kollar på satsen ovan så får man logiken:
dagen datum skall vara onsdag, LastRunDate får inte vara dagens datum(det löser du smidigare med dateDiffmetoden btw) OCH TimeString måste vara "16:00:00".
Så frågan är var du tilldelar TimeString och LastRunDate värden? Om det inte är så att du tilldelar TimeString värdet "16:00:00" direkt i deklarationen så kommer ju aldrig IF-satsen at bli sann.
Flödet blir ju
1. Tjänsten försöker starta och kör OnStartmetoden
2. Kontrollerar IF-satsen där LastRunDate inte får vara dagens datum samt att TimeString MÅSTE vara "16:00:00"
3. Tjänsten har startats och gör? Ja vadå, enligt exemplet ovan ingenting...
Jag tror helt enkelt att du inte har rätt värden på LastRunDate och Timestring när du försöker köra. Du skriver även "Porblemet är att den inte skriver till filen kl 16:00." men i det du har angett så finns ingen som helst logik för att skriva till något vid klockslaget 16:00:00, utan metoden du har körs enbart när servicen startas.
Så mitt förslag är:
1. använd EventLog1.WriteEntry() för att skriva ut värdena du får på LastRunDate och TimeString och se om de blir tok. De MÅSTE vara dagens datum OCH "16:00:00" NÄR servicen startar för att logiken som du har skall fungera.
2. Tänk på att OnStart körs ENDAST när servicen startar och inte vid vissa klockslag vilket gör att du inte kan förvänta dig att den skriver något klockan 16:00:00 (om du inte startar servicen exakt då).
3. Tänk över vad du vill uppnå och hur du vill genomföra det. Skriv gärna här vad du vill göra så kan du få tips...
Förslag:
Vill du ha en service som skriver till en logg vid ett klockslag så gör en service med Onstartmetod. Lägg till en Timer till din service med intervall på några sekunder (minuter eller hur stor noggranhet du nu vill ha) och i Din OnStart metod så kör du enbart timerns Start funktion. Sedan kontrollerar du datum och tid i timerns Tick funktion. Sv:Windows service
<code>
Dim LastRun As DateTime = Now.AddDays(-1)
Dim NextRun As DateTime = datum + tiden 16:00:00
Protected Overrides Sub OnStart(ByVal args() As String)
EventLog1.WriteEntry("Service Started")
Timer1.Interval = 5000
Timer1.Start()
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If Now.DayOfWeek = DayOfWeek.Wednesday And DateDiff("d", Now, LastRun) <> 0 And DateDiff(DateInterval.Minute, TimeOfDay, nextrun) > 0 Then
'Skriv....
LastRun = Now()
End If
End Sub
End Class
</code>
Var 5'e sekund kommer Timer1_Tick att köras och kontrollera tiden. Det här är inget exempel som går att köra utan enbart ett exempel på hur man skulle kunna göra. För ökad prestand så kolla även på AndAlsoSv: Windows service
<code>
If Now.DayOfWeek = DayOfWeek.Wednesday And Not (LastRunDate.Year = Now.Year And LastRunDate.Month = Now.Month And LastRunDate.Day = Now.Day) And TimeString = "16:00:00" Then
</code>
eftersom TimeString returnerar den aktuella tiden. Man skulle även kunna byta ut det till now.hour = 16 and now.minute = 00
Nu blir nästa steg att hämta data från X antal databaser och skriva till fil.Sv:Windows service
Visst funkar din IF-sats men det vore smidigare om du lärde dig DateDiff-metoden som finns just för att jämföra datum (om inte annat blir koden mycket mer lättläst och överskådlig). Kolla oxå upp skillnaden mellan AND och ANDALSO så ser du att ANDALSO skulle göra en del för prestanda, speciellt i en service som kanske loopar ofta.Sv:Windows service
Frågan är väl inte om din TimeString fungerar om den körs vid rätt tidpunkt. Men som din kod är skriven så måste denna loop genomlöpas minst två gånger per sekund för att garantera att du intemissar detta villkoret. Låt oss t.ex. säga att du kolla 15:59:59 då körs inte din kod, likaväl så körs den inte om nästa mätning ärr två sekunder senare, dvs 16:00:01. Så prestanda mässigt har du ett program som ligger och lastar ner datorn genom att genomlöpa en loop minst två gånger per sekund, det är just sådana saker som iallafall jag inte vill ha på min dator.
Sedan kan man ju fundera på vad som händer om du skall köra detta på en annan dator med andra inställningar, t.ex. på kulturen. Låt oss säga att du kör i London då blir klockan förmodligen aldrig "16:00:00" utan snarare "4:00:00 pm"...
Jag skulle rekommendera att du utnyttjar windows möjligheter till notification. Du kan sätta upp ett program att prenumerera på olika händelser i windows, däribland tidshändelser. Så du kan få windows att sätta igång ditt program vid en viss tidpunkt. Kör man klassisk VB 6 så löste man detta med diverse API funktioner, hur man gör i .Net vet jag inte ännu men jag utgår från att det finns motsvarande funktioner i .Net plattformen, om inte så får man väl använda API funktionerna fortfarande.
Lycka till!
// Johan