Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come visualizzare la barra di avanzamento durante l'esecuzione di SQLCommand VB.Net di grandi dimensioni

Ecco un esempio ridotto di come eseguire il lavoro asincrono con VB.Net 4.0.

Immaginiamo di avere un modulo con le seguenti importazioni,

Imports System.Windows.Forms
Imports System.Threading
Imports System.Threading.Tasks

Quel modulo ha due controlli

Private WithEvents DoSomthing As Button
Private WithEvents Progress As ProgressBar

Da qualche parte nella tua applicazione abbiamo una Function chiamato ExecuteSlowStuff , questa funzione è l'equivalente del tuo executeMyQuery . La parte importante è l'Action parametro che la funzione usa per mostrare che sta procedendo.

Private Shared Function ExecuteSlowStuff(ByVal progress As Action) As Integer
    Dim result = 0
    For i = 0 To 10000
        result += i
        Thread.Sleep(500)
        progress()
    Next

    Return result
End Function

Diciamo che questo lavoro è iniziato con il clic del DoSomething Button .

Private Sub Start() Handled DoSomething.Click
    Dim slowStuff = Task(Of Integer).Factory.StartNew(
        Function() ExceuteSlowStuff(AddressOf Me.ShowProgress))
End Sub

Probabilmente ti starai chiedendo dove ShowProgress viene da, questa è la parte più disordinata.

Private Sub ShowProgress()
    If Me.Progress.InvokeRequired Then
        Dim cross As new Action(AddressOf Me.ShowProgress)
        Me.Invoke(cross)
    Else 
        If Me.Progress.Value = Me.Progress.Maximum Then
            Me.Progress.Value = Me.Progress.Minimum
        Else
            Me.Progress.Increment(1)
        End If

        Me.Progress.Refresh()
    End if
End Sub

Nota che perché ShowProgress può essere invocato da un altro thread, controlla le chiamate incrociate. In tal caso si richiama sul thread principale.