0

我有一个程序,其主要功能是每隔 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
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 回答