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();
            }
        }