2013-10-17 44 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之后并执行该代码。尼斯是一种简单的方法来保持您的应用程序响应并保持(看似)线性流。

当然还有更多的异步/等待,你可能需要投入一些时间去适应它,但我想这是值得的任何一分钟投资!