private static void Drop(DownloadInfo dif, bool emitEvent)
        {
            if (dif == null)
            {
                throw new ArgumentNullException("dif");
            }

            lock (register_drop_sync)
            {
                lock (downloads.SyncRoot)
                {
                    downloads.Remove(dif.UniqueKey);
                }

                lock (dispatcher.SyncRoot)
                {
                    dispatcher.Drop(dif);
                }

                lock (download_queue.SyncRoot)
                {
                    download_queue.Dequeue(dif);
                }

                lock (downloads.SyncRoot)
                {
                    if (downloads.Count == 0)
                    {
                        dispatcher.Enabled = false;

                        DestroyUserEvent((dif.State == DownloadState.Canceled));

                        lock (tsm.SyncRoot)
                        {
                            tsm.Reset();
                        }
                    }
                }
            }

            if (emitEvent)
            {
                EmitDownloadDropped(new DownloadEventArgs(dif));
            }
        }