2013-10-17 47 views
0

我有一個程序,其主要功能是每x時間從MySQL數據庫中提取數據並相應地調整GUI。VB.net MySQL連接檢查不工作/慢

我有兩個部分的問題,第一件事發生在於我的GUI在連接嘗試時加載速度非常慢,您可以從字面上看到逐個加載的標籤/盒/圖像,直到MySQL檢查完成。

以次修復的方法是在功能前添加me.Hide(),然後在顯示檢查結果後重新顯示。你能看看代碼嗎?將添加MySQL檢查功能,然後調用它在Form1_Load help

第二部分是我的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 

回答

1

.Connect()是一個阻塞調用,因此你不應該把它放到一個處理Load事件一分。以Activated爲例,並檢查它是否運行。您可能還想查看自VS2012以來正式提供的異步/等待。雖然將任何東西放入Load可能會導致異常,但這並不是一個好主意,因爲在此階段的異常處理存在問題,該問題發生在運行32位版本代碼的64位機器上(爲了簡化)。

基本的想法是保持UI-Thread(處理你的表單的重畫等)免於「繁重」的工作,這意味着當使用某種「線程」時你會得到最好的結果。異步/等待是一個非常簡單的方法,因爲它保持了通常的程序流程。

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關鍵字的方法。這是必要的,因爲在C#中await是/不是保留字,否則它可能會破壞舊代碼。 Await意味着在任務被調度之後,UI線程將繼續並且可以重繪,處理事件等等。當內部方法完成時(通常在其自己的線程中),UI線程直接「跳」到線在Await之後並執行該代碼。尼斯是一種簡單的方法來保持您的應用程序響應並保持(看似)線性流。

當然還有更多的異步/等待,你可能需要投入一些時間去適應它,但我想這是值得的任何一分鐘投資!