Support Forums
[VB.Net] Time Delay While Keeping UI Functional (Delegates, StopWatch, Threads) - Printable Version

+- Support Forums (http://www.supportforums.net)
+-- Forum: Categories (http://www.supportforums.net/forumdisplay.php?fid=87)
+--- Forum: Coding Support Forums (http://www.supportforums.net/forumdisplay.php?fid=18)
+---- Forum: Visual Basic and the .NET Framework (http://www.supportforums.net/forumdisplay.php?fid=19)
+---- Thread: [VB.Net] Time Delay While Keeping UI Functional (Delegates, StopWatch, Threads) (/showthread.php?tid=27050)



[VB.Net] Time Delay While Keeping UI Functional (Delegates, StopWatch, Threads) - AceInfinity - 09-03-2012

Code:
Public Class Form1

#Region "Form1 Constructor"
    Public Sub New()
        InitializeComponent()
    End Sub
#End Region

    'Start Here
    Private Sub MainMethod()
        Dim Tp = Tuple.Create("message box string", "title", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)
        Me.Pause(2500, New DelegateAfterDelay(AddressOf AfterDelay), Tp)
    End Sub

    'After the Pause, this gets raised
    Delegate Sub DelegateAfterDelay(Tp As Tuple(Of String, String, MessageBoxButtons, MessageBoxIcon))
    Private Sub AfterDelay(Tp As Tuple(Of String, String, MessageBoxButtons, MessageBoxIcon))
        MessageBox.Show(Tp.Item1, Tp.Item2, Tp.Item3, Tp.Item4)
    End Sub

End Class

Public Module DelayModule
    <Runtime.CompilerServices.Extension()> _
    Public Sub Pause(sender As Object, Milliseconds As Integer, DelegateMethod As [Delegate], ParamArray Params As Object())
        Dim T As New Thread(Sub() PauseMethod(sender, Milliseconds, DelegateMethod, Params))
        T.Start()
    End Sub

    Private Sub PauseMethod(sender As Object, Milliseconds As Integer, DelegateMethod As [Delegate], ParamArray Params As Object())
        Dim S As Stopwatch = Stopwatch.StartNew
        While S.ElapsedMilliseconds < Milliseconds
            'Do Nothing
        End While
        DirectCast(sender, Form).Invoke(DelegateMethod, Params)
    End Sub
End Module

Some code I came up with while thinking of ways to create a delay that wouldn't interfere with the UI, and wouldn't use Application.DoEvents(). Here's a cool method Smile

Just test code, use it if you want. Ask questions if you don't understand my code. Nice extension method Smile

Pirate