diff --git a/src/Bonsai.DAQmx/AnalogOutput.cs b/src/Bonsai.DAQmx/AnalogOutput.cs index f3785bc..b956556 100644 --- a/src/Bonsai.DAQmx/AnalogOutput.cs +++ b/src/Bonsai.DAQmx/AnalogOutput.cs @@ -135,13 +135,19 @@ public override IObservable Process(IObservable source) task.Control(TaskAction.Verify); task.Timing.ConfigureSampleClock(SignalSource, SampleRate, ActiveEdge, SampleMode, BufferSize); var analogOutWriter = new AnalogMultiChannelWriter(task.Stream); + void EnsureTaskIsDone() + { + if (task.Timing.SampleQuantityMode == SampleQuantityMode.FiniteSamples) + { + task.WaitUntilDone(); + } + } + return Observable.Using( () => Disposable.Create(() => { - if (task.Timing.SampleQuantityMode == SampleQuantityMode.FiniteSamples) - { - task.WaitUntilDone(); - } + if (!task.IsDone) + EnsureTaskIsDone(); task.Stop(); task.Dispose(); }), @@ -157,7 +163,7 @@ public override IObservable Process(IObservable source) analogOutWriter.WriteMultiSample(autoStart: true, data); } finally { dataHandle.Free(); } - })); + }, EnsureTaskIsDone)); }); } } diff --git a/src/Bonsai.DAQmx/DigitalOutput.cs b/src/Bonsai.DAQmx/DigitalOutput.cs index b8e9b9b..ae4676e 100644 --- a/src/Bonsai.DAQmx/DigitalOutput.cs +++ b/src/Bonsai.DAQmx/DigitalOutput.cs @@ -84,7 +84,8 @@ IObservable ProcessSingleSample(IObservable source, A return Observable.Using( () => Disposable.Create(() => { - task.WaitUntilDone(); + if (!task.IsDone) + task.WaitUntilDone(); task.Stop(); task.Dispose(); }), @@ -92,7 +93,7 @@ IObservable ProcessSingleSample(IObservable source, A { try { onNext(digitalOutWriter, input); } catch { task.Stop(); throw; } - })); + }, task.WaitUntilDone)); }); } @@ -271,13 +272,19 @@ IObservable ProcessMultiSample(IObservable source, Ac var task = CreateTask(); task.Timing.ConfigureSampleClock(SignalSource, SampleRate, ActiveEdge, SampleMode, BufferSize); var digitalOutWriter = new DigitalMultiChannelWriter(task.Stream); + void EnsureTaskIsDone() + { + if (task.Timing.SampleQuantityMode == SampleQuantityMode.FiniteSamples) + { + task.WaitUntilDone(); + } + } + return Observable.Using( () => Disposable.Create(() => { - if (task.Timing.SampleQuantityMode == SampleQuantityMode.FiniteSamples) - { - task.WaitUntilDone(); - } + if (!task.IsDone) + EnsureTaskIsDone(); task.Stop(); task.Dispose(); }), @@ -285,7 +292,7 @@ IObservable ProcessMultiSample(IObservable source, Ac { try { onNext(digitalOutWriter, input); } catch { task.Stop(); throw; } - })); + }, EnsureTaskIsDone)); }); }