Hey,

auch wenn die Frage mit Sicherheit schon in die Jahre gekommen ist, wollte ich noch etwas ergänzen. Ich bin heute durch einen Vorschlag auf diese Frage gestoßen..

Wer zukünftig auf diesen Thread stößt, möchte ggf. meinen Beitrag auf meiner Homepage zum asynchronen Warten ansehen, denn..:

https://robbelroot.de/blog/vbnet-await/

Von einem vorherigen Nutzer wurde ja bereits die Verwendung von z. B.

System.Threading.Thread.Sleep(<wartedauerInMillisekunden>)

vorgeschlagen.

Allerdings ist das wie in deinem Fall für die Verwendung im GUI-Thread mehr als schlecht, da vermutlich alles hängen wird und Du auf nichts mehr zugreifen können wirst.

Danach hatte er eine Sleep-Variante mit Application.DoEvents() vorgeschlagen, um das Einfrieren mehr oder weniger auszutricksen. Diese Methode sollte man ebenso nicht verwenden, denn es geht 1. einfacher und 2. effizienter – mit async/await, also mit Tasks.

Dazu musst Du die Methode einfach nur als "async" kennzeichnen und dort auf die Abarbeitung der Task mit Hilfe von "await" warten.

Ebenso könntest Du für das Hinzufügen von Text innerhalb der RichtTextBox auch die AppendText() Methode, oder die Text-Eigenschaft anders verwenden.

Statt der vbNewLine-Konstante würde sich auch ein Environment.NewLine anbieten.

Je nach VB.NET Version man nutzt etc., kann man auch auf String-Interpolation zurückgreifen (siehe zweite Zeile)

Private Async Sub Button1_Click(sender As object, e As EventArgs) Handles Button1.Click
  Do
    Dim waitTime = 500 ' oder As Integer explizit..
    RichTextBox1.AppendText("Text1" & Environment.NewLine)
    Await Task.Delay(waitTime)
    RichTextBox1.Text &= $"Text2 {Environment.NewLine}"
    Await Task.Delay(waitTime)
  Loop
End Sub

Eventuell solltest Du hier auch eine Möglichkeit zur Begrenzung der Schleife einbauen. Also zum Beispiel im FormClosing-Handler ein Boolean-Flag auf False setzen, Welches dann innerhalb der Loop abgefragt wird.

...zur Antwort

Hey, ich weiß, dass der Beitrag schon was älter ist, aber ich selbst bin heute darauf gestoßen und habe auf meiner Webseite meine eigene Lösung veröffentlicht.

Du findest mögliche Lösungen, Alternativen und den Download unter folgendem Link:

https://robbelroot.de/blog/vbnet-anwendungsdauer-auslesen/

Dort erkläre ich, wie man das Problem lösen kann und welche Unterschiede es z. B. bei Winforms und WPF gibt.

Ebenso gehe ich auf die Möglichkeit einer Erweiterungsmethode ein.

Der fertige Winforms Code sieht so aus:

Module modExtensions

    Public Class Extensions

        Public Class Application

            Public Shared Function GetTimeRunning() As TimeSpan
                Dim timeDiff = Date.Now - Process.GetCurrentProcess().StartTime
                Return timeDiff
            End Function

        End Class

    End Class

End Module

Und kann so aufgerufen werden:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Debug.WriteLine(Extensions.Application.GetTimeRunning())
    End Sub

Bei WPF sieht das ganze Aufgrund der einfach zugreifbaren Application-Instanz anders aus:

Imports System.Runtime.CompilerServices


Module modExtensions


    <Extension>
    Public Function GetTimeRunning(app As Windows.Application) As TimeSpan
        Dim timeDiff = Date.Now - Process.GetCurrentProcess().StartTime
        Return timeDiff
    End Function


End Module

Aufruf:

    Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
        Dim runningTime = Application.Current.GetTimeRunning()
        Debug.WriteLine(runningTime)
    End Sub
...zur Antwort