上调试和运行模式
问题描述:
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个文件。
我搜索了这个问题,但所有的答案都是关于数字,我没有处理数字(我想)。请帮助并为我的糟糕英语感到抱歉。
答
由于-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个文件)。
我的猜测是,因为你不''等待'client.DownloadFileAsync()',多个请求同时发出,这是WebClient不支持([见本](https://stackoverflow.com/问题/ 13755623/webclient-does-not-support-concurrent-io-operations)),但是这些异常从未被捕获,因为没有观察到'client.DownloadFileAsync()'返回的任务结果。换句话说,在client.DownloadFileAsync()方法中设置'async'和'await'方法; –
如果发布的版本与调试版本不同,那么发行版并未使用最新源代码完全编译。通常在项目中删除bin文件夹将强制所有代码重新编译。您可以在发布和调试文件夹中检查exe文件的时间戳,并确保版本可执行文件稍后再进行调试。 – jdweng