public void QueueDownload_Received(QueueDownload queuedownload) {

			Console.WriteLine("[NSUrlSessionManager] QueueDownload");

			var download = queuedownload.Download;

			Console.WriteLine("[NSUrlSessionManager] QueueDownload Url           : {0}", download.Url);
			Console.WriteLine("[NSUrlSessionManager] QueueDownload Total         : {0}", download.Total);
			Console.WriteLine("[NSUrlSessionManager] QueueDownload Written       : {0}", download.Written);
			Console.WriteLine("[NSUrlSessionManager] QueueDownload DownloadState : {0}", download.DownloadState);
			Console.WriteLine("[NSUrlSessionManager] QueueDownload State         : {0}", download.State);
			Console.WriteLine("[NSUrlSessionManager] QueueDownload LastModified  : {0}", download.LastModified);

			NSUrlSession.GetTasks2 ((dataTasks, uploadTasks, downloadTasks) => {
					
				int free = _maxdownloads - downloadTasks.Length;

				Console.WriteLine ("[NSUrlSessionManager] QueueDownload GetTasks2");
				Console.WriteLine ("[NSUrlSessionManager] QueueDownload GetTasks2 Maxdownloads : {0}", _maxdownloads);
				Console.WriteLine ("[NSUrlSessionManager] QueueDownload GetTasks2 Length       : {0}", downloadTasks.Length);
				Console.WriteLine ("[NSUrlSessionManager] QueueDownload GetTasks2 Free         : {0}", free);

				if (free <= 0) {
					_bus.SendAsync<DownloadRejected> (new DownloadRejected {
						Id = download.Id,
						Reason = RejectionEnum.QueueFull
					});
					return;
				}

				using (var url = NSUrl.FromString (download.Url))
				using (var request = NSUrlRequest.FromUrl (url)) {
					var task = NSUrlSession.CreateDownloadTask (request);
					task.TaskDescription = download.Id.ToString ();
					task.Resume ();
				}

			});

		}
		public async void FreeSlot(FreeSlot freeslot) {

			Console.WriteLine("[Downloadanager] FreeSlot");

			int downloading = _repo.CountByState (State.Downloading);
			if (downloading >= _maxdownload) {
				await _bus.SendAsync<QueueFull> (new QueueFull{
					Downloading = downloading,
					MaxDownload = _maxdownload
				});
				return;
			}

			Download waiting;
			bool dequeued = _repo.FirstByState (State.Waiting, out waiting);
			if (!dequeued) {
				await _bus.SendAsync<QueueEmpty> (new QueueEmpty());
				return;
			}

			bool resumed = waiting.TryResume ();
			if (!resumed) {
				await _bus.SendAsync<DownloadError> (new DownloadError {
					Id = waiting.Id,
					State = waiting.State,
					Error = ErrorEnum.FreeSlot_InvalidState
				});
				return;
			}
			_repo.Update (waiting);

			var queuedownload = new QueueDownload {
				Download = waiting
			};
			await _bus.SendAsync<QueueDownload> (queuedownload);
		}