private void Downloader(object state) { foreach (Tuple <bool, object> t in _pictures) { try { _exportImagesWorker.Export(t.Item1, t.Item2); } catch (Exception ex) { string errormessage = ex.Message; if (ex.InnerException != null) { errormessage = ex.InnerException.Message; } AppendMessage(string.Format("{0} -> {1}", t.Item2, errormessage), false); } DownloadReporter.Progress(); } DownloadReporter.Finish(); JobFinished(); }
private void Downloader(object state) { string url = null; while (true) { int currentJob = -1; try { _lock.EnterWriteLock(); currentJob = _nextJob; _nextJob++; _lock.ExitWriteLock(); if (currentJob >= _urls.Count || IsStopping) { break; } KeyValuePair <string, object> kv = _urls[currentJob]; url = kv.Key; //Do the first alone to wait for proxy if needed if (currentJob == 0 || _firstDoneEvent.WaitOne()) { if (_fatalException) { break; } string errors = Download(url, kv.Value); if (!string.IsNullOrWhiteSpace(errors)) { AppendMessage(string.Format("{0} -> {1}", url, errors), false); } } DownloadReporter.Progress(); } catch (Exception ex) { if (currentJob == 0) { _fatalException = true; } string errormessage = ex.Message; if (ex.InnerException != null) { errormessage = ex.InnerException.Message; } AppendMessage(string.Format("{0} -> {1}", url, errormessage), false); } finally { //First finished, Go for the others if (currentJob == 0) { _firstDoneEvent.Set(); } } Interlocked.Decrement(ref CountDown); } if (CountDown == 0 || IsStopping || _fatalException) { DownloadReporter.Finish(); JobFinished(); } }