private void RemoveVideoSessionOwnership(VideoSessionOwnership ownership) { _VideoSessions.Remove(ownership); OwnershipRemoveRequested?.Invoke(this, new SessionOwnershipRemoveRequestedEventArgs(ownership.VideoId)); }
public async Task <VideoSessionOwnership> TryRentVideoSessionOwnershipAsync(string videoId, bool isPriorityRent) { if (CanAddDownloadLine()) { var ownership = new VideoSessionOwnership(videoId, this); _VideoSessions.Add(ownership); return(ownership); } var handlers = RentFailed; if (handlers != null) { TaskCompletionSource <bool> taskCompletionSource = new TaskCompletionSource <bool>(); var args = new SessionOwnershipRentFailedEventArgs(() => taskCompletionSource.SetResult(true)); handlers.Invoke(this, args); await Task.Delay(10); if (args.IsUseDeferral) { await taskCompletionSource.Task; } if (!args.IsHandled) { return(null); } if (isPriorityRent) { var session = _VideoSessions.First(); session.TriggerStopOwnership(); (session as IDisposable).Dispose(); await Task.Delay(10); } if (CanAddDownloadLine()) { var ownership = new VideoSessionOwnership(videoId, this); _VideoSessions.Add(ownership); return(ownership); } } else { if (isPriorityRent) { var session = _VideoSessions.First(); session.TriggerStopOwnership(); (session as IDisposable).Dispose(); await Task.Delay(10); } if (CanAddDownloadLine()) { var ownership = new VideoSessionOwnership(videoId, this); _VideoSessions.Add(ownership); return(ownership); } } return(null); }