async Task <IMediaStreamConfiguration> IMediaStreamControl.OpenAsync(CancellationToken cancellationToken) { if (null == this._mediaStreamSource) { throw new InvalidOperationException("MediaStreamSource has not been created"); } IMediaManager mediaManager = this.MediaManager; if (null == mediaManager) { throw new InvalidOperationException("MediaManager has not been initialized"); } TaskCompletionSource <IMediaStreamConfiguration> openCompletionSource = this._openCompletionSource; Action cancellationAction = (Action)(() => { Task task = mediaManager.CloseMediaAsync(); TaskCollector.Default.Add(task, "MediaSteamConfigurator.OpenAsync mediaManager.CloseMediaAsync"); openCompletionSource.TrySetCanceled(); }); using (cancellationToken.Register(cancellationAction)) { Task timeoutTask = TaskEx.Delay(MediaStreamConfigurator.OpenTimeout, cancellationToken); Task task = await TaskEx.WhenAny((Task)this._openCompletionSource.Task, timeoutTask).ConfigureAwait(false); } if (!this._openCompletionSource.Task.IsCompleted) { cancellationAction(); } return(await this._openCompletionSource.Task.ConfigureAwait(false)); }