VB.Net別のスレッドでタスクを実行する

SilverShotBee

私は小さなデータベース管理ツールを開発しています。アプリケーションを起動してデータベースへの接続を試みたいのですが、データベースはネットワークドライブ上にあるため、時間がかかる場合があります。この間、アプリケーションはハングします。

以下のコードを使用して、別のスレッドでデータベースに接続するコードを実行して、アプリケーションをロードし、データベースを個別に接続できるようにします。

Public Class Incident_Form

    'DELEGATE CLASSES
    Delegate Sub UpdateTable()

    'DELEGATE VARIABLES
    Public UpdateTableVar As UpdateTable

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


        I_List.DataSource = Nothing
        Display_Module.Maximise_Window()

        Splash_Panel.BringToFront()

        System.Windows.Forms.Application.DoEvents()

        UpdateTableVar = New UpdateTable(AddressOf Me.UpdateTableHandler)

        Me.Invoke(Me.UpdateTableVar)


    End Sub



    Public Sub UpdateTableHandler() 'Handles the background work for updating I_LIST
        If (Me.InvokeRequired) Then
            Me.Invoke(UpdateTableVar)
        Else
            Dim myCon = New OleDbConnection(My.Settings.Database_Connection_String)
            myCon.Open()

            Dim ds As DataSet = New DataSet
            Dim adapter As New OleDb.OleDbDataAdapter
            Dim sql As String

            sql = "SELECT [IN_REF], [Incident Name], [Date Created], [Created By] " & _
            "FROM [Master_Record]"

            adapter.SelectCommand = New OleDb.OleDbCommand(sql, myCon)
            adapter.Fill(ds)
            I_List.DataSource = ds.Tables(0)

            I_List.Columns(1).AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
            I_List.Columns(0).HeaderText = "Reference"

            I_List.Sort(I_List.Columns("Date Created"), System.ComponentModel.ListSortDirection.Descending)

            myCon.Close()
        End If
    End Sub

上記の問題は、アプリケーションがフォームを正しくロードして表示しても、データベースの接続が完了するまでユーザーがフォームを操作できないことです。別のスレッドで実行されているようですが、続行する前にそのスレッドが終了するのを待っています。

私が見逃しているものがありますか、それともこれは正しいアプローチではありませんか?

更新1

助けてくれてありがとう、私はコードを次のように更新しました、そしてすべてが正しく働いています:)

Public Class Incident_Form

    Dim ds As DataSet = New DataSet





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


        I_List.DataSource = Nothing
        Display_Module.Maximise_Window()
        Splash_Panel.BringToFront()
        System.Windows.Forms.Application.DoEvents()
        Try
            BackgroundWorker1.RunWorkerAsync()
        Catch ex As Exception
            BackgroundWorker1.WorkerSupportsCancellation = True
            BackgroundWorker1.CancelAsync()
        End Try




    End Sub

    Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

        UpdateTableHandler()

    End Sub


    Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        I_List.DataSource = ds.Tables(0)

        I_List.Columns(1).AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
        I_List.Columns(0).HeaderText = "Reference"

        I_List.Sort(I_List.Columns("Date Created"), System.ComponentModel.ListSortDirection.Descending)
    End Sub


    Public Sub UpdateTableHandler() 'Handles the background work for updating I_LIST

        Dim myCon = New OleDbConnection(My.Settings.Database_Connection_String)
        myCon.Open()


        Dim adapter As New OleDb.OleDbDataAdapter
        Dim sql As String

        sql = "SELECT [IN_REF], [Incident Name], [Date Created], [Created By] " & _
        "FROM [Master_Record]"

        adapter.SelectCommand = New OleDb.OleDbCommand(sql, myCon)
        adapter.Fill(ds)


        myCon.Close()

    End Sub
アイシールド21

フォームに追加してDoEvents()通話をに置き換えますBackgroundWorker

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

    I_List.DataSource = Nothing
    Display_Module.Maximise_Window()
    Splash_Panel.BringToFront()

    Try
        BackgroundWorker1.RunWorkerAsync()    
    Catch ex As Exception
        BackgroundWorker1p.WorkerSupportsCancellation = True
        BackgroundWorker1.CancelAsync()
    End Try
End Sub

Private Sub BackgroundWorker1_DoWork(sender As Object, e As 
System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

    UpdateTableHandler()

End Sub

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ボタンをクリックすると、VB.netでPythonスクリプトを実行します

分類Dev

VB.NETの汎用インターフェイスコレクションに拡張メソッドを実装することは可能ですか?

分類Dev

vb.netでスリープ中にバックグラウンドで.Gif画像を実行する方法

分類Dev

実行時にvb.netでリストのタイプを定義する

分類Dev

下記のタスク(vb.net)を実行するにはどうすればよいですか?

分類Dev

C#の同じソリューションで別のプロジェクトバッドからvbスクリプトを実行する

分類Dev

vb.netでのスレッド化に関する問題

分類Dev

別のスレッドvb.netから(Tの)BindingListを更新します

分類Dev

データバインドされたコンボボックスVb.netに空の行を追加する

分類Dev

VB.NET-別のスレッドから値を読み取る方法

分類Dev

vb.net : 別のフォーム/スレッドから JSON からデータグリッドにデータを収集する際のエラー

分類Dev

vb.netのサウンドVUレベルに基づいてスクリプトを実行します

分類Dev

VB.NETを使用してイーサネットとWiFiのIPアドレスを区別する方法

分類Dev

ジェネリッククラスVB.NETの型を判別する方法

分類Dev

VB.Net:複数のテキストボックスからの複数のパラメーター入力を使用して.exeを実行する

分類Dev

SQL、vb.netを実行していないデータグリッドビューからデータベースにクエリをマージする

分類Dev

vb6-Windows7以降でネットワークアダプターの物理アドレスを取得する

分類Dev

VB.NETのパネル内でプロセスを実行する

分類Dev

テキストボックスの行を追加するVb.net

分類Dev

vb.netの順序で開始する複数のスレッド

分類Dev

同じデータベースvb.netから複数のテキストボックスに複数のレコードを表示する方法

分類Dev

別のクラスのメンバーとしてのみインスタンス化できるが、VB.NETでこれを介してパブリックにアクセスできるクラスを作成することは可能ですか?

分類Dev

VB.NetでSQLiteデータベースをバックアップする

分類Dev

VB.NET:スレッドが実行中または終了しています。再起動できません

分類Dev

VB .NETは、毎日指定された時間にスレッドを実行します

分類Dev

VB.NET-クラスオブジェクトのlinqにカスタムメソッドを追加するにはどうすればよいですか?

分類Dev

vb.netでタイプurlのテキストボックスを制限する方法

分類Dev

.net 1.1 を使用して vb.net で php スクリプトを実行する

分類Dev

リバーステキストであるリソース内のテキストファイルからコードを実行する-vb.net

Related 関連記事

  1. 1

    ボタンをクリックすると、VB.netでPythonスクリプトを実行します

  2. 2

    VB.NETの汎用インターフェイスコレクションに拡張メソッドを実装することは可能ですか?

  3. 3

    vb.netでスリープ中にバックグラウンドで.Gif画像を実行する方法

  4. 4

    実行時にvb.netでリストのタイプを定義する

  5. 5

    下記のタスク(vb.net)を実行するにはどうすればよいですか?

  6. 6

    C#の同じソリューションで別のプロジェクトバッドからvbスクリプトを実行する

  7. 7

    vb.netでのスレッド化に関する問題

  8. 8

    別のスレッドvb.netから(Tの)BindingListを更新します

  9. 9

    データバインドされたコンボボックスVb.netに空の行を追加する

  10. 10

    VB.NET-別のスレッドから値を読み取る方法

  11. 11

    vb.net : 別のフォーム/スレッドから JSON からデータグリッドにデータを収集する際のエラー

  12. 12

    vb.netのサウンドVUレベルに基づいてスクリプトを実行します

  13. 13

    VB.NETを使用してイーサネットとWiFiのIPアドレスを区別する方法

  14. 14

    ジェネリッククラスVB.NETの型を判別する方法

  15. 15

    VB.Net:複数のテキストボックスからの複数のパラメーター入力を使用して.exeを実行する

  16. 16

    SQL、vb.netを実行していないデータグリッドビューからデータベースにクエリをマージする

  17. 17

    vb6-Windows7以降でネットワークアダプターの物理アドレスを取得する

  18. 18

    VB.NETのパネル内でプロセスを実行する

  19. 19

    テキストボックスの行を追加するVb.net

  20. 20

    vb.netの順序で開始する複数のスレッド

  21. 21

    同じデータベースvb.netから複数のテキストボックスに複数のレコードを表示する方法

  22. 22

    別のクラスのメンバーとしてのみインスタンス化できるが、VB.NETでこれを介してパブリックにアクセスできるクラスを作成することは可能ですか?

  23. 23

    VB.NetでSQLiteデータベースをバックアップする

  24. 24

    VB.NET:スレッドが実行中または終了しています。再起動できません

  25. 25

    VB .NETは、毎日指定された時間にスレッドを実行します

  26. 26

    VB.NET-クラスオブジェクトのlinqにカスタムメソッドを追加するにはどうすればよいですか?

  27. 27

    vb.netでタイプurlのテキストボックスを制限する方法

  28. 28

    .net 1.1 を使用して vb.net で php スクリプトを実行する

  29. 29

    リバーステキストであるリソース内のテキストファイルからコードを実行する-vb.net

ホットタグ

アーカイブ