我有一个程序,其主要功能是每隔x个时间从MySQL数据库中提取数据并相应地调整GUI。
我有一个两部分问题,第一件事就是我的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
答案 0 :(得分:1)
.Connect()
是一个阻止调用,因此您不应将其放入处理Load
事件的子中。例如,将它放入Activated
并检查它是否已运行。您可能还想查看自VS2012以来正式可用的async / await。虽然将Load
放入任何可能导致异常的内容仍然不是一个好主意,因为在这个阶段的异常处理存在问题,这个问题发生在运行32位版本代码的64位机器上(为了保持简单)
基本思想是保持UI-Thread(处理重新绘制表单等)免于“繁重”工作,这意味着在使用某种“线程”时将获得最佳结果。 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关键字。这是必需的,因为等待是/不是C#中的保留字,否则它可能会破坏旧代码。
Await
意味着在任务被调度之后,UI线程将继续并且可以重绘,处理事件等。当内部方法完成时(通常在其自己的线程中),UI线程“跳转”到直接在Await
之后的行并执行该代码。很好的方法可以让您的应用程序保持响应并保持(看似)线性流程。
当然还有更多关于async / await的内容,你可能需要投入一些时间来适应它,但我猜它值得任何一分钟投入!