VisualBasic Server mit Timerobjekten?

Smagjus

Vice Admiral
Registriert
Feb. 2011
Beiträge
6.146
Hallo allerseits,

ich habe vor eine kleine Server-Client-Anwendung zu programmieren, die nebenbei auch andere Tätigkeiten ausführt.

Das Problem:
Der Server wartet mittels AcceptTcpClient() auf Anfragen und wie es scheint, reagiert das Programm nicht auf die Timer.tick() Events, solange der Server wartet.

Konkret möchte ich, dass der Server in regelmäßigen Abständen Sicherungen anfertigt, während ich einem Client erlaube, per Textbefehl diese zu verwalten.

Kann ich das beides irgendwie synchronisieren?

Vielen Dank im Voraus für alle Antworten :)


EDIT:
Es handelt sich um eine VB.net Anwendung, weshalb ich mit C# Lösungen auch zufrieden wäre.
Ergänzung ()

Weiß keiner eine Antwort?
 
Zuletzt bearbeitet:
Kannst du bitte ein paar Zeilen Code posten?
Deiner Beschreibung nach klingt das schon sehr merkwürdig ;)
Eigentlich feuern alle Timer ausser der Forms-Timer auf einem seperaten Thread. Damit du den blockst, müsste dein Server-Code allerdings im UI-Thread laufen.
Also bitte ein wenig Code und kurze Info, ob Service, Konsole, Forms oder WPF.

Gruß
 
Okay, das ganze ist eine Konsolenanwendung:

Hier die main()
PHP:
   Public Shared Sub Main()


        CopiesPerDay = 12
        KeepCopyDays = 7
        BackUpTimer.Interval = CInt(1000) '24 / CopiesPerDay * 60 * 60 * 1000)
        DeleteTimer.Interval = CInt(24 * 60 * 60 * 1000)

        BackUpTimer.Start() : DeleteTimer.Start()
        connect("192.168.178.25")
    End Sub

Und dazu noch die connect()
PHP:
    Private Shared Sub connect(ByVal ip As String)
        Dim server As TcpListener
        server = Nothing
        Try
            Dim port As Int32 = 1234
            Dim localAddr As IPAddress = IPAddress.Parse(ip)
            server = New TcpListener(localAddr, port)
            server.Start()

            Dim bytes(1024) As Byte
            Dim data As String = Nothing

            While True
                Console.Write("Waiting for a connection... ")
                Dim client As TcpClient = server.AcceptTcpClient()
                Console.WriteLine("Connected!")
                data = Nothing
                Dim stream As NetworkStream = client.GetStream()
                Dim i As Int32 = stream.Read(bytes, 0, bytes.Length)

                data = System.Text.Encoding.ASCII.GetString(bytes, 0, i)
                Console.WriteLine("Received: {0}", data)
                data = ExecuteCommandAndReturn(data)

                Dim msg As Byte() = System.Text.Encoding.ASCII.GetBytes(data)
                stream.Write(msg, 0, msg.Length)

                Console.WriteLine("Sent: {0}", System.Text.Encoding.ASCII.GetString(msg))
                client.Close()
            End While
        Catch e As SocketException
            Console.WriteLine("SocketException: {0}", e)
        Finally
            server.Stop()
        End Try

        Console.WriteLine(ControlChars.Cr + "Hit enter to continue....")
        Console.Read()

    End Sub
Meine Timer_Tick Methode
PHP:
Private Shared Sub BackUpTimer_Tick(sender As System.Object, e As System.EventArgs) Handles BackUpTimer.Tick
        Console.Write("Data saved")

    End Sub
Der Rest dürfte eigentlich nicht von Relevanz sein. Der Timer ist einer Testversion, deswegen nur der Console.write Aufruf. Aber schonmal vielen Dank für deine Antwort^^

EDIT:

Nach einigem rumprobieren, habe ich festgestellt, dass das Timer.tick() Event in einer Konsole überhaupt nicht feuert. Gibt es da eine Alternative?

EDIT2:

Fehler gefunden. Ich habe die falsche Timer Klasse verwendet. Die richtige für die Konsole ist die System.Threading.Thread Klasse. Hier ein Beispiel:
PHP:
Imports System.Threading

Public Class Form1

    Public Shared Sub Main()
        Dim autoEvent As New AutoResetEvent(False)
        Dim timerDelegate As TimerCallback = AddressOf CheckStatus
        Dim stateTimer As Timer = New Timer(timerDelegate, autoEvent, 0, 500)

        While True
            If (MessageBox.Show("HI (Main Thread)") = Windows.Forms.DialogResult.OK) Then
            End If
            Threading.Thread.Sleep(4000)
        End While
    End Sub

    Shared Sub CheckStatus(stateInfo As Object)
        Console.WriteLine("HI (Timer)")
    End Sub
end class
 
Zuletzt bearbeitet:
Zurück
Oben