2016-05-23 4 views
0

У меня есть функция, которая выполняет синхронную задачу, я бы сделал то же самое, но с асинхронной задачей.Visual Basic Async Task вместо Sync Task

Как мне это сделать?

Это код:

Public Class Form1 Private taskOUT Как Task

Private Sub Button_Start_Click (отправитель As Object, е Как 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 

End Class

+0

Пожалуйста, разместите свой код не как изображение. Это действительно трудно читать, и у SO есть функция подсветки синтаксиса ... –

+0

Спасибо, я исправил. –

ответ

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 - он просто гарантирует, что когда ваша задача будет завершена, следующий шаг в конвейере будет выполняться в потоке пользовательского интерфейса. Если вы этого не сделаете и попытаетесь каким-то образом обновить графический интерфейс, вы получите ошибки.

Начнем с создания задачи, которая возвращает массив удвоений, запустив функцию gensin. Затем мы добавляем задачу продолжения, которая записывает результат. Задача продолжения выполняется только в том случае, если первая задача завершена в порядке. Если вы отменили его, или он выбросил ошибку, это не сработало. Таким образом вы можете объединить целую кучу задач с четкой маршрутизацией для результатов успеха/отказа/отмены