public static async Task<IList<Item>> UpdateFeedAsync(Feed feed, TimeSpan timeout) {
            using (var downloader = new DownloadHelper(timeout))
            using (var reader = await downloader.DownloadXmlAsync(feed.Url)) {
                var factory = GetFeedFactory(reader);

                if (factory != null) {
                    return factory.UpdateFeed(feed, reader);
                }

                return new Item[0];
            }
        }
        public static Feed DownloadFeed(string url, TimeSpan timeout) {
            using (var download = new DownloadHelper(timeout))
            using (var reader = download.DownloadXml(url)) {
                var factory = GetFeedFactory(reader);

                if (factory != null) {
                    var feed = factory.CreateFeed(reader, url);

                    return feed;
                }

                return null;
            }
        }
        // Instantiated as active download.
        public DownloadViewModel(ItemViewModel item, string filename)
            : this() {
            _downloadHelper = new DownloadHelper(Settings.Default.DownloadTimeout);
            _downloadHelper.DownloadProgressChanged += _downloadHelper_DownloadProgressChanged;

            Title = item.Title;
            FeedTitle = item.FeedTitle;
            FileName = filename;
            Url = item.PodcastUrl;
            State = DownloadState.Downloading;
            StartTime = DateTime.Now;
            _podcastType = DownloadHelper.GetPodcastType(FileName);

            // Timer for UI updates.
            _updateTimer = new DispatcherTimer();
            _updateTimer.Interval = DownloadUpdateInternal;
            _updateTimer.Tick += _updateTimer_Tick;

            StartAsync(); // Start download.
        }