Refactor context task to allow asynchronous dispose #132
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The current implementation of
ContextTask
is blocking with respect to both register access, start and stop of acquisition and context disposal, with a significant amount of state shared across calls.Here we propose to refactor the implementation to eliminate almost all shared state, and instead redefine the acquisition task as a proper TPL task composed of two sub-tasks,
readFrames
anddistributeFrames
. This task can be cancelled asynchronously and therefore allows implementing a non-blocking version of theDispose
method which simply triggers acquisition task cancellation and prevents its restart.StartAsync
method calls are also meant to be mutually exclusive, so care was taken to prevent acquisition tasks to be called concurrently on the same context.Fixes #131