我有一个执行同步任务的函数,我会做同样的但是使用异步任务 .
我应该怎么做 ?
这是代码:
公共类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 回答
这样的事情应该这样做:
我将WriteData拆分为一个单独的函数,因为我没有库 . 你可以把它写成lamda函数 . 要取消该任务,只需从取消按钮处理程序中调用cancelSource.cancel即可 .
可能不需要uiSyncContext - 它只是确保当您的任务完成时,管道中的下一步将在UI线程上运行 . 如果您不这样做,并且尝试以某种方式更新GUI,则会出现错误 .
我们首先创建一个通过运行gensin函数返回双精度数组的任务 . 然后,我们附加一个写入输出的继续任务 . 仅当第一个任务完成正常时,才会运行继续任务 . 如果您取消了它,或者它抛出了错误,则不会运行 . 您可以通过这种方式将大量任务链接在一起,并为成功/失败/取消结果提供不同的路由