2017-10-14 69 views
0
public void Imagesaver(string url) 
{ 
    string result = Filename(url); 
    string SourceCode = worker.GetSourceCode(url); 

    List<string> names1 = new List<string>(); 

    MatchCollection data2 = Regex.Matches(SourceCode, "(src=\"|src=\\/\")([^>]*?jpg|png|gif)", RegexOptions.Singleline); 

    string name = string.Empty; 

    foreach (Match m in data2) 
    { 
     name = m.Groups[2].Value; 

     if (name.Contains("http")) 
     { 
      names1.Add(name); 
     } 
     else 
     { 
      names1.Add(url+name); 
     } 
    } 

    WebClient client = new WebClient(); 
    int i = 0; 

    foreach (string name2 in names1) 
    { 
     Uri imageurl = new Uri(name2); 

     try 
     { 
      client.DownloadFileAsync(imageurl, (@"C:\Users\Ramazan BIYIK\Desktop\HTML içerik\" + result+"\\" + i + ".jpg")); 
      i++; 
     } 
     catch(Exception ex) 
     { 
      continue; 
     } 
    } 
} 

不同的结果我有一个代码块从源代码在一个网站可以节省.jpg.png.gif扩展名的文件下载到本地。但是当我在调试和非调试模式下尝试时,它显示出不同的结果。上调试和运行模式

例如在一个网站上有40个文件,其中.jpg扩展名。在调试模式下,我可以下载它们,除了在运行时,我只能下载6个文件。

我搜索了这个问题,但所有的答案都是关于数字,我没有处理数字(我想)。请帮助并为我的糟糕英语感到抱歉。

+1

我的猜测是,因为你不''等待'client.DownloadFileAsync()',多个请求同时发出,这是WebClient不支持([见本](https://stackoverflow.com/问题/ 13755623/webclient-does-not-support-concurrent-io-operations)),但是这些异常从未被捕获,因为没有观察到'client.DownloadFileAsync()'返回的任务结果。换句话说,在client.DownloadFileAsync()方法中设置'async'和'await'方法; –

+0

如果发布的版本与调试版本不同,那么发行版并未使用最新源代码完全编译。通常在项目中删除bin文件夹将强制所有代码重新编译。您可以在发布和调试文件夹中检查exe文件的时间戳,并确保版本可执行文件稍后再进行调试。 – jdweng

回答

0

由于-Nuf问题得到解决。请分享您的推荐。 我跟着这个link。问题是,我只尝试一个webclient实例。这是我的问题的答案。使用异步方法和

foreach (string name2 in names1) 
{ 
     WebClient client = new WebClient(); 
     Uri imageurl = new Uri(name2); 
     try 
     { 

      client.DownloadFileAsync(imageurl, (@"C:\Users\Ramazan BIYIK\Desktop\HTML içerik\" + result+"\\" + i + ".jpg")); 
      i++; 
     } 
      catch(Exception ex) {continue; } 
} 

Hovewer等待在某些情况下,表达可以工作(或使用它在一个错误的方式我'):

public async void Imagesaver(string url) 
{ 

    string result = Filename(url); 
    string SourceCode = worker.GetSourceCode(url); 
    List<string> names1 = new List<string>(); 
    MatchCollection data2 = Regex.Matches(SourceCode, "(src=\"|src=\\/\")([^>]*?jpg|png|gif)", RegexOptions.Singleline); 

    string name = string.Empty; 

     foreach (Match m in data2) 
     { 

      name = m.Groups[2].Value; 

      if (name.Contains("http")) 
      { 
       names1.Add(name); 
      } 
      else 
      { 
       names1.Add(url+name); 
      } 

     } 

     int i = 0; 
     WebClient client = new WebClient(); 
     foreach (string name2 in names1) 
     { 

      Uri imageurl = new Uri(name2); 
      try 
      { 

       await Task.Run(()=>client.DownloadFileAsync(imageurl, (@"C:\Users\Ramazan BIYIK\Desktop\HTML içerik\" + result+"\\" + i + ".jpg"))); 
       i++; 
      } 
      catch(Exception ex) {continue; } 
     } 

有了这个代码块,我可以下载多个文件,然后第一代码块(我的问题中的代码块)。

因此,我只能下载6个文件只有一个webclient实例(与我的问题代码块)。当我使用异步方法时,我可以下载18个文件。但是当我在foreach循环中使用实例时,我可以下载所有文件(40个文件)。

相关问题