Vb.net 同时跑两个项目

Vb.net 同时跑两个项目,vb.net,Vb.net,我的动画文本的代码已经存储在我的表格1中,在我的MDIParent1中运行得很好,没有任何错误。但是当我执行另一个代码(例如,当我单击按钮时打印代码)时,动画文本将暂时停止,文本的动画将非常沉重。请说明如何运行其他代码而不影响我的动画文本? 模块1中的我的代码 Public Sub Text_Panel_Animation() Try Dim da As New OleDbDataAdapter("Select * from Table1 order by Id", Co

我的动画文本的代码已经存储在我的表格1中,在我的MDIParent1中运行得很好,没有任何错误。但是当我执行另一个代码(例如,当我单击按钮时打印代码)时,动画文本将暂时停止,文本的动画将非常沉重。请说明如何运行其他代码而不影响我的动画文本? 模块1中的我的代码

Public Sub Text_Panel_Animation()
    Try
        Dim da As New OleDbDataAdapter("Select * from Table1 order by Id", Con)
        Dim dt As New DataTable
        da.Fill(dt)
        MDIParent1.Label1.Left = 0 - MDIParent1.Label1.Width
        If dt.Rows.Count > 0 Then
            For r As Integer = 1 To dt.Columns.Count - 1
                MDIParent1.Label1.Text &= "  " & (dt(0)(r).ToString)
            Next
            MDIParent1.Timer1.Start()
        End If
        Con.Close()
    Catch ex As Exception
        MsgBox(ex.Message(), MsgBoxStyle.Critical, "Error")
    End Try
End Sub
在MDIParent1加载中。。我把这个代码:

 Call Text_Panel_Animation()
而在第1。。我还:

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    If Label1.Left >= Me.Panel1.Width Then Label1.Left = 0 - Label1.Width
    Label1.Left += 1
End Sub
我尝试使用此代码,但遇到了相同的问题:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Task.Run(Sub()
         Try
             Dim Dt As New DataTable
             Dim SQLstr As String = "Select * from Table1"
             SQLstr = "Select * from Table1 order BY Id"
             Dim Da As New OleDbDataAdapter(SQLstr, Con)
             Da.Fill(Dt)
             Dim Rpt As New Crystal1
             Rpt.SetDataSource(Dt)
             Dim frm As New Form1
             Me.Dispose()
             frm.Show()
             Form1.CrystalReportViewer1.Zoom(100%)
         Catch
         End Try
    End Sub)
End Sub

您可以在新任务中开始打印

Private Sub Button_Print_Click (sender As Object, e As EventArgs) Handles Button_Print.Click) 
    Task.Run(Sub()
        'TODO: Do the printing here...
    End Sub)
End Sub
请注意,您必须采取预防措施才能从其他任务访问UI。见:


我不会在另一个任务中做任何UI工作,因为这可能会导致问题。相反,我只会查询DB并在另一个任务中呈现报告,然后在执行与UI相关的操作之前等待此任务。我自己并没有使用Crystal Reports,但它可能是这样的

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim Rpt As Crystal1

    Await Task.Run(
        Sub()
            Try
                Dim Dt As New DataTable
                Dim SQLstr As String
                SQLstr = "Select * from Table1 order BY Id"
                Dim Da As New OleDbDataAdapter(SQLstr, Con)
                Da.Fill(Dt)
                Rpt = New Crystal1
                Rpt.SetDataSource(Dt)
            Catch
            End Try
        End Sub)

    Dim frm As New Form1
    Me.Dispose()
    frm.Show()
    Form1.CrystalReportViewer1.Zoom(100%)
    Form1.CrystalReportViewer1.ReportSource = Rpt
End Sub
不要忘记方法标题中的
Async
关键字


注意:如果
Me
是主窗体,则
Me.Dispose()
将终止应用程序。

当然OP可以使用另一个任务,但同时,OP需要进行一些调用,这是一个阻塞操作,尤其是在WinForms和任何与UI相关的操作中。。。TBH,这对另一项任务没有多大帮助…感谢Olivier的想法和你的精彩链接,我将尝试在youtube上关注它们。打印代码是我的问题的一个简单例子,因为我也有几个代码造成了同样的问题。请告诉我如何将动画文本的代码放入新任务中。诚挚的@đěxěŕ:我很抱歉建议在另一个线程中进行打印,而不是UI内容,也就是说,不是动画。(控制台.WriteLine只是打印的占位符)。好的,谢谢你的评论。承认我有一个按钮打印(私有子按钮打印)点击(发件人作为对象,e作为事件参数)处理按钮打印。点击)。。我将在这行中写些什么来完成一项新任务这是一个巨大的问题。这取决于打印的内容和方式。您可以使用报告工具或创建自己的报告。如果你搜索“vb网络打印”,你会发现很多东西。