0

私は、x時間ごとにMySQLデータベースからデータを取得し、それに応じてGUIを調整することを主な機能とするプログラムを持っています。

最初に発生するのは、接続が試行されている間、バックグラウンドで GUI の読み込みが非常に遅くなるという 2 つの部分の問題があります。MySQL チェックが完了するまで、各ラベル/ボックス/画像が 1 つずつ読み込まれているのを文字通り見ることができます。 .

お粗末な修正はme.Hide()、関​​数の前に a を追加し、チェックの結果が表示された後に再度表示することです。コードを見ていただけますか?関数に MySQL チェックを追加して、それを呼び出しForm1_Load helpますか?

これの 2 番目の部分は、MySQL 接続チェッカーが機能していないように見えることです。現在、私のホストはリモート MySQL セッションを受け入れており、しばらくの間接続を考えているようです...接続前に 6/7 秒が適切です。エラーメッセージが表示されます。

私はほとんどガイドに従ってコードを自分で書きました。各部分は理解していますが、おそらく私のConnectionStringものは無効だと思います。

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        MaximizeBox = False

        Dim conn As MySqlConnection

        conn = New MySqlConnection
        conn.ConnectionString = "Server=50.28.x.x; Port=3306; User id=xxx_admin; password=xxxx; Database=xxx_software; Connect Timeout=60;"

        Try
            conn.Open()

        Catch myerror As MySqlException
            MsgBox("There was an error connecting to the MySQL Database")
            Label42.ForeColor = Color.Red
            Label42.Text = "ERROR"
            Timer1.Stop()
        End Try

        Timer1.Start()
        Label37.Text = Now.ToShortTimeString()

    End Sub
4

1 に答える 1

1

.Connect()はブロッキング呼び出しであるため、Loadイベントを処理するサブルーチンに配置しないでください。たとえば、それを入れて、Activated実行されたかどうかを確認します。また、VS2012 以降で正式に利用可能になった async/await を調べることもできます。例外を引き起こす可能性のあるものを に入れることはまだ良い考えではありませんがLoad、32 ビット バージョンのコードを実行している 64 ビット マシンで発生するこの段階での例外処理に問題があるためです (簡潔にするため)。

基本的な考え方は、UI スレッド (フォームの再描画などを処理する) を「重い」作業から解放することです。これは、ある種の「スレッド」を使用するときに最良の結果が得られることを意味します。async/await は、通常のプログラム フローを維持するため、非常に簡単に実行できます。

Public Class Form1

Private InitDone As Boolean = False

Private Async Sub Form1_Activated(sender As Object, e As EventArgs) Handles Me.Activated

    If Not InitDone Then
        InitDone = True
        ' simulate some blocking call
        Await Task.Run(Sub() Threading.Thread.Sleep(10000))
        Me.Text = "Ready to go"
    End If

End Sub

クラス終了

Asyncメソッドで await キーワードを使用できるようにするデコレータです。これが必要なのは、await が C# の予約語である/そうでなかったためです。そうしないと、古いコードが壊れる可能性があります。これAwaitは、タスクがスケジュールされた後、UI スレッドが続行され、イベントなどを再描画、処理できることを意味します。内部メソッドが (通常は独自のスレッドで) 終了すると、UI スレッドは直後の行に「ジャンプ」しAwait、そのコードを実行します。アプリの応答性を維持し、(一見) 直線的なフローを維持する簡単な方法です。

もちろん、async/await には他にも多くの機能があり、慣れるまで少し時間がかかるかもしれませんが、少しでも投資する価値があると思います。

于 2013-10-17T06:46:09.327 に答える