首页 文章

Visual Basic异步任务而不是同步任务

提问于
浏览
0

我有一个执行同步任务的函数,我会做同样的但是使用异步任务 .

我应该怎么做 ?

这是代码:

公共类Form1私有任务作为任务

Private Sub Button_Start_Click(sender as Object,e As EventArgs)处理Button_Start.Click

Dim freq As Double = TextBox1.Text
    Dim Amp As Double = TextBox2.Text
    Dim SPB As Double = TextBox3.Text
    Dim CPB As Double = TextBox4.Text
    '---------------------------------------
    Dim SCRate As Double = (freq * SPB) / CPB
    '---------------------------------------
    taskOUT = New Task()  'Crea un task
    taskOUT.AOChannels.CreateVoltageChannel("Dev1/ao0", "", -10, 10, AOVoltageUnits.Volts) 'Aggiunge un canale in Out
    taskOUT.Timing.SampleClockRate = SCRate
    taskOUT.Timing.ConfigureSampleClock("", SCRate, SampleClockActiveEdge.Rising, SampleQuantityMode.ContinuousSamples, 1000)
    '-----------------------------
    Dim ydata As Double()
    ydata = GenSin(freq, Amp, SCRate, SPB)
    '-------------------------------------------
    Dim writer As New AnalogSingleChannelWriter(taskOUT.Stream)
    writer.WriteMultiSample(False, ydata)
    taskOUT.Start()
End Sub
'-----------------------------------------------------------------------
Public Shared Function GenSin( _
    ByVal freq As Double, _
    ByVal amp As Double, _
    ByVal sampleClockRate As Double, _
    ByVal samplePerBuffer As Double) As Double()

    Dim dt As Double
    Dim IntSample As Integer

    dt = 1 / sampleClockRate
    IntSample = CInt(SamplePerBuffer) - 1
    Dim y(IntSample - 1) As Double
    For i As Integer = 0 To IntSample - 1
        y(i) = amp * Math.Sin((2.0 * Math.PI) * freq * (i * dt))
    Next
    Return y
End Function

Private Sub Button_Stop_Click(sender As Object, e As EventArgs) Handles Button_Stop.Click
    taskOUT.Stop()
    taskOUT.Dispose()
End Sub

结束班

1 回答

  • 1

    这样的事情应该这样做:

    Private cancelSource As CancellationTokenSource
    
    Sub StartWork
            cancelSource = New CancellationTokenSource
            Dim uiSyncContext = Tasks.TaskScheduler.FromCurrentSynchronizationContext
            Dim task = New Tasks.Task(Of Double())(Function() GenSin(3.4, 1.2, 100.0, 1000.0, cancelSource.Token))
            task.ContinueWith(Sub(dt) WriteData(dt.result), 
                              cancelToken, 
                              Tasks.TaskContinuationOptions.OnlyOnRanToCompletion, 
                              uiSyncContext)
        End Sub
    
        Function GenSin(freq As Double, amp As Double, rate As Double, spb As Double, cancelToken As CancellationToken) As Double()
            Dim dt As Double
            Dim isamp As Integer
            dt = 1 / rate
            isamp = CInt(spb) - 1
            Dim y(isamp - 1) As Double
            For i As Integer = 0 To isamp - 1
                If cancelToken.IsCancellationRequested Then Return Nothing
                y(i) = amp * Math.Sin(2 * Math.PI * freq * i * dt)
            Next
            Return y
        End Function
    
        Sub WriteData(results As Double()) 
            ' This is where you output the data
        End Sub
    

    我将WriteData拆分为一个单独的函数,因为我没有库 . 你可以把它写成lamda函数 . 要取消该任务,只需从取消按钮处理程序中调用cancelSource.cancel即可 .

    可能不需要uiSyncContext - 它只是确保当您的任务完成时,管道中的下一步将在UI线程上运行 . 如果您不这样做,并且尝试以某种方式更新GUI,则会出现错误 .

    我们首先创建一个通过运行gensin函数返回双精度数组的任务 . 然后,我们附加一个写入输出的继续任务 . 仅当第一个任务完成正常时,才会运行继续任务 . 如果您取消了它,或者它抛出了错误,则不会运行 . 您可以通过这种方式将大量任务链接在一起,并为成功/失败/取消结果提供不同的路由

相关问题