0

長いロード時間中にユーザーに何かを見つめるために、無限ループの進行状況バーが必要です。現在、ユーザーが実行する SQL クエリを選択すると、クエリ結果のグリッドビューを含む別の winform に結果が表示されます。私の目標は、結果フォームのグリッドビューのレンダリングが終了するまで無限にいっぱいになり、何度もリセットされるプログレスバーを持つ別のwinform(ロードフォーム)を持つことです。パフォーマンスのためにマルチスレッドが必要になると思われるため、バックグラウンドワーカーを試しましたが、ロードフォームは表示されません。基本的に、実行計画は次のようになります。

ユーザーが実行ボタンをクリックし、ロード フォームにプログレス バーを表示する (無限ループ)、クエリを実行し、結果フォームをロードする ロード フォームのプログレス バーを閉じる

上記の実行はメインフォームから呼び出されます

Private Sub LoadingForm_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    pbSqlCall.Minimum = 0
    pbSqlCall.Maximum = 100
    pbSqlCall.Step = 10
    Dim Counter As Integer = 0
    While Counter < 100
        pbSqlCall.Increment(10)
        Counter += 10
        If Counter = 100 Then
            Counter = 0
            pbSqlCall.Value = 0
        End If
    End While
End Sub


    BackgroundWorker1.RunWorkerAsync()
    ExecuteQuery(Parameters, Queries.Item(ddlQueries.SelectedIndex))
    'Not sure how to close the form using the thread


Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    lf.ShowDialog() 'Load form
End Sub
4

1 に答える 1

1

「ローダー」と呼ばれるフォームと「メイン」と呼ばれるフォームを指定すると、次のことができます。

ローダ:

Public Class Loader
    Private Sub Loader_Load(sender As Object, e As EventArgs) Handles MyBase.Load
       pbSqlCall.Style = ProgressBarStyle.Marquee
       pbSqlCall.MarqueeAnimationSpeed = 30
    End Sub
End Class

主要:

Imports System.Threading.Tasks
Public Class Main

    Private Sub DoWork_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim lf As New Loader
        lf.Show(Me)

        Task.Factory.StartNew(Sub()
                                  'go get the data for the grid
                                  System.Threading.Thread.Sleep(6000)
                              End Sub) _
                    .ContinueWith(Sub(result As task)
                                      'check the aggregate exception
                                      Dim aex As System.AggregateException = result.Exception
                                      If aex IsNot Nothing Then
                                          MessageBox.Show(String.Format("something bad happened: ", aex.Flatten.Message))
                                      End If

                                      'bind the data to the grid
                                      lf.Close()
                                      lf.Dispose()
                                  End Sub, TaskScheduler.FromCurrentSynchronizationContext)

    End Sub

    Private Sub Main_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    End Sub
End Class
于 2013-03-21T17:08:13.040 に答える