0

我有一个 Winform 应用程序。单击 button2 后,应用程序将开始下载大量图像,其 url 存储在 ThousandsOfImageURLs 列表中。该应用程序适用于前 40 个图像下载。但是之后,函数 ParallelRunBrowser 中的 Task.Factory.StartNew 无法启动 RunBrowserThread。我可以看到每 10 秒 Task.Factory.StartNew 被击中,但在下载大约 40 张图像后,DownLoadImages 类的 RunBrowserThread 内的断点无法再被击中。我没有看到以这种方式在几个小时内抛出任何异常。

可能的问题是什么?

谢谢,

    private void button2_Click(object sender, EventArgs e)
    {
        var sta = new StaTaskScheduler(numberOfThreads: 4);
        var doImages = new ThreadLocal<DownLoadImages>(() => new DownLoadImages());

        foreach (string url in ThousandsOfImageURLs)
              ParallelRunBrowser(strSiteRoot + url, sta, doImages);
            }
        }
    }

    private void ParallelRunBrowser(string url, StaTaskScheduler sta, ThreadLocal<DownLoadImages> doImages)
    {
        Thread.Sleep(10000);

            Task.Factory.StartNew(() =>
            {
                doImages.Value.RunBrowserThread(new Uri(url));
            },
            CancellationToken.None,
            TaskCreationOptions.None,
            sta);
    }


class DownLoadImages
{
    public void RunBrowserThread(Uri url)
    {
            var br = new WebBrowser();
            br.DocumentCompleted += Browser_DocumentCompleted;
            br.Navigate(url);
            Application.Run();
    }

    void Browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        var br = sender as WebBrowser;
        if (br.Url == e.Url)
        {
                FinishDownLoadHere(sender, e);
                Application.ExitThread();   
                ((WebBrowser)sender).Dispose();
                GC.Collect();
        }
    } 
}
4

1 回答 1

2

使用 webbrowsers,Application.Run 和 GC.collect 似乎有点多。

为什么不使用 WebClient 来获取图像?

来自:从 .NET/C# 中的站点下载图像

string localFilename = @"c:\localpath\tofile.jpg";
using(WebClient client = new WebClient())
{
    client.DownloadFile("http://www.example.com/image.jpg", localFilename);
}
于 2014-01-03T10:08:36.807 回答