/// <summary> /// Initializes a new instance of the <see cref="QueuedCameraTask"/> class. /// </summary> /// <param name="task">The actual camera task object this class wraps.</param> public QueuedCameraTask(ICameraTask task) { this.Task = task; this.taskWaitHandle = new ManualResetEventSlim(false); this.Task.Complete += this.TaskCompleted; }
/// <summary> /// Releases unmanaged and - optionally - managed resources. /// </summary> /// <param name="disposing"> /// <see langword="true"/> to release both managed and unmanaged resources; /// <see langword="false"/> to release only unmanaged resources. /// </param> private void Dispose(bool disposing) { if (this.disposed) { return; } // Mark this class as disposed early, so the method(s) relying on // the disposable objects (eg, taskWaitHandle) will know that // those objects are no longer valid. this.disposed = true; if (disposing) { this.Task.Complete -= this.TaskCompleted; if (this.taskWaitHandle != null) { // Set the event in case someone is waiting for it. this.taskWaitHandle.Set(); this.taskWaitHandle.Dispose(); this.taskWaitHandle = null; } IDisposable disposableTask = this.Task as IDisposable; if (disposableTask != null) { disposableTask.Dispose(); } this.Task = null; } }
/// <summary> /// Synchronously adds the <paramref name="cameraTask"/> given to an execution queue /// and returns awaitable task to wait for the <paramref name="cameraTask"/> completion. /// </summary> /// <param name="cameraTask">Task to enqueue.</param> /// <returns>Awaitable task.</returns> /// <exception cref="ArgumentNullException"><paramref name="cameraTask"/> is <see langword="null"/>.</exception> public Task EnqueueTaskAsync(ICameraTask cameraTask) { if (cameraTask == null) { throw new ArgumentNullException("cameraTask"); } QueuedCameraTask task = this.AddTaskToQueue(cameraTask); return(Task.Run(() => task.WaitForComplete(Timeout.InfiniteTimeSpan))); }
/// <summary> /// Synchronously adds the <paramref name="cameraTask"/> given to an execution queue /// and returns awaitable task to wait for the <paramref name="cameraTask"/> completion. /// </summary> /// <param name="cameraTask">Task to enqueue.</param> /// <returns>Awaitable task.</returns> /// <exception cref="ArgumentNullException"><paramref name="cameraTask"/> is <see langword="null"/>.</exception> public Task EnqueueTaskAsync(ICameraTask cameraTask) { if (cameraTask == null) { throw new ArgumentNullException("cameraTask"); } QueuedCameraTask task = this.AddTaskToQueue(cameraTask); return Task.Run(() => task.WaitForComplete(Timeout.InfiniteTimeSpan)); }
/// <summary> /// Adds the <paramref name="cameraTask"/> specified to the execution queue. /// </summary> /// <param name="cameraTask">The camera task to add to the queue.</param> /// <returns>Execution wrapper for the <paramref name="cameraTask"/> given.</returns> private QueuedCameraTask AddTaskToQueue(ICameraTask cameraTask) { QueuedCameraTask queuedTask = new QueuedCameraTask(cameraTask); lock (this.syncRoot) { this.pendingTasks.Add(queuedTask); this.ScheduleNextTask(); } return(queuedTask); }
/// <summary> /// Adds the <paramref name="cameraTask"/> specified to the execution queue. /// </summary> /// <param name="cameraTask">The camera task to add to the queue.</param> /// <returns>Execution wrapper for the <paramref name="cameraTask"/> given.</returns> private QueuedCameraTask AddTaskToQueue(ICameraTask cameraTask) { QueuedCameraTask queuedTask = new QueuedCameraTask(cameraTask); lock (this.syncRoot) { this.pendingTasks.Add(queuedTask); this.ScheduleNextTask(); } return queuedTask; }