试图创建一个小邮件应用程序 - 检查邮件和键入新邮件时滞后

时间:2014-04-22 04:49:16

标签: vb.net multithreading

在我正在开发的应用程序中,我构建了一些功能,允许用户相互发送“迷你”电子邮件。基本上,我只是将内容输出到MySQL数据库,然后轮询数据库以检查数据库中是否有任何具有Read = False状态的用户条目。我还有一个表单,显示所有消息的收件箱(和发件箱),打开时不断刷新。我发现的问题是,当用户在消息正文字段中输入详细信息时,当软件检查数据库中的新消息时,每xx都会有一个恒定的延迟。

我知道我没有正确设置,因此我采用了构建此例程的最佳方法。

MainForm:有一个计时器,每隔5秒触发一次针对数据库运行查询并返回整数值SELECT COUNT(*) FROM Mail WHERE is_read = 0 AND recipient = " & Current_User.Id

ShowMessagesForm:打开时,对数据库进行初始查询,并将当前用户的所有消息返回到DataTable中。然后清除Listview控件并使用DataTable重新填充。

Private Sub LoadMessages()
    Dim QueryString As String

    Try
        'Populate Inbox
        lsvMail.Items.Clear()
        If InboxDataTable IsNot Nothing Then InboxDataTable.Clear()
        QueryString = "SELECT m.id, Recipient.Display_Name AS Recipient, Sender.Display_Name AS Sender, m.subject, m.body, m.call_id, m.is_read, m.replied, m.followup, m.deleted, m.sent_deleted, m.sent " & _
                        "FROM Mail m " & _
                        "LEFT JOIN Clients Sender ON m.Sender = Sender.id " & _
                        "LEFT JOIN Clients Recipient ON m.Recipient = Recipient.id " & _
                        "WHERE m.Recipient = " & Current_User.Id & " AND m.deleted = 0 " & _
                        "ORDER BY m.Sent DESC"
        InboxDataTable = db_Connection.ReturnData(QueryString)
        If InboxDataTable.Rows.Count > 0 Then
            For x = 0 To (InboxDataTable.Rows.Count - 1)
                Dim lvi As New ListViewItem(InboxDataTable.Rows(x)("replied").ToString)
                lvi.SubItems.Add(InboxDataTable.Rows(x)("sender").ToString)

                If CBool(InboxDataTable.Rows(x)("is_read")) = True Then
                    lvi.Font = RegularFont
                Else
                    lvi.Font = BoldFont
                End If

                If CBool(InboxDataTable.Rows(x)("followup")) = True Then
                    lvi.ForeColor = Color.Red
                Else
                    lvi.ForeColor = Color.Black
                End If

                lvi.SubItems.Add(DecryptData(InboxDataTable.Rows(x)("subject").ToString))
                lvi.SubItems.Add(InboxDataTable.Rows(x)("sent").ToString)
                lvi.SubItems.Add(InboxDataTable.Rows(x)("followup").ToString)
                lvi.Name = InboxDataTable.Rows(x)("id").ToString
                lsvMail.Items.Add(lvi)
            Next
        End If

    Catch ex As Exception
        CreateLog("Module: frmShowMessages: LoadMailMessages()" & vbNewLine & "Exception Error: " & ex.Message)
        MsgBox("Exception Error: " & ex.Message, MsgBoxStyle.Critical, "Module: frmShowMessages: LoadMailMessages()")
    End Try
End Sub

此表单上还有一个Timer控件,每隔5秒触发一次,每次运行上面的Sub Routine。

ComposeMessageForm:只需包含主题文本框和body richtextbox控件。

当我在richtextbox中输入文本时,我发现只要定时器在ShowMessagesForm上触发,它就会在我的表单上输入时产生延迟。

所以基本上,我想我问的是创建一个不断检查消息的小应用程序的最佳方法是什么?它需要检查主窗体以查看用户是否有任何新消息,然后不断刷新收件箱列表视图,以防在窗体打开时收到任何消息。

提前致谢。

1 个答案:

答案 0 :(得分:0)

对于这种情况,您必须使用多个线程。这样,轮询逻辑在单独的线程中实现,不会影响应用程序的其余部分。