C#WebClient多执行
我的网络客户端有问题 简单我检查一个文件夹中丢失的文件。如果我没有这个文件,使用WebClient,我会导航到web页面并发送一个值来执行查询并将该值存储在数据库中 我的问题是: 例如,我有一个1500个元素的列表。 但在第一个元素之后,for循环停止(可能)或不再导航 我的代码:C#WebClient多执行,c#,webclient,C#,Webclient,我的网络客户端有问题 简单我检查一个文件夹中丢失的文件。如果我没有这个文件,使用WebClient,我会导航到web页面并发送一个值来执行查询并将该值存储在数据库中 我的问题是: 例如,我有一个1500个元素的列表。 但在第一个元素之后,for循环停止(可能)或不再导航 我的代码: List<string> fileneed = new List<string>(); List fileneeded=new List(); 在线程中 //Distinct
List<string> fileneed = new List<string>();
List fileneeded=new List();
在线程中
//Distinct
fileneed = fileneed.Distinct().ToList<string>();
for (int i = 0; i < fileneed.Count; i++)
{
if (fileneed[i].Contains("."))
{
w = new WebClient();
w.OpenRead("http://mywebsite.org/collab/files.php?act=need&user=" + Properties.Settings.Default.user + "&file=" + fileneed[i]);
fileneed.RemoveAt(i);
}
}
//不同
fileneed=fileneed.Distinct().ToList();
for(int i=0;i
执行完线程后,我转到我的PhpMyAdmin,只看到一个文件。
列表中的其他文件不显示、不存在或有奇怪的问题,“我的代码”在循环中执行一次。您正在打开与该文件的“连接”,但您没有读取或存储该文件。您需要创建一个新文件,并从远程流读取和写入本地文件流:
using(var myFile = File.OpenWrite(fileneed[i]))
{
w.CopyTo(myFile);
}
有关详细信息,请参见您正在打开与该文件的“连接”,但您没有读取或存储该文件。您需要创建一个新文件,并从远程流读取和写入本地文件流:
using(var myFile = File.OpenWrite(fileneed[i]))
{
w.CopyTo(myFile);
}
有关详细信息,请参阅
我不知道这一页到底做什么,但你应该删除这一行
fileneed.RemoveAt(i);
每次迭代,您都会删除元素并Count
更改。若要删除已处理的项,可以将其存储在另一个列表中,而不是原始字符串列表中
我不知道这一页到底做什么,但你应该删除这一行
fileneed.RemoveAt(i);
每次迭代,您都会删除元素并
Count
更改。如果要删除已处理的项目,可以将其存储在另一个列表中,而不是原始字符串列表中。示例代码有一些错误:
第一:因为它正在从列表中读取内容的同时从fileneed
列表中删除项目,所以它将跳过列表中的文件。这是因为当您删除一个项目时,以下所有项目的索引都会变小一个。我们可以通过从头到尾迭代列表来解决这个问题
第二:虽然代码正在从服务器读取文件,但它并没有对文件执行任何操作以将其写入磁盘。因此,文件将丢失。这可以通过打开文件流并复制到其中来解决
第三:WebClient
和从OpenRead
返回的流需要被删除。否则,它们使用的资源将不会被清理,您的程序将成为内存/连接占用者。这是通过使用语句修复的
通过这三个修复,生成的代码如下所示:
fileneed = fileneed.Distinct().ToList<string>();
for (int i = fileneed.Count - 1; i >= 0; i--)
{
if (fileneed[i].Contains("."))
{
using (var w = new WebClient())
using (var webFile = w.OpenRead("http://mywebsite.org/collab/files.php?act=need&user=" + Properties.Settings.Default.user + "&file=" + fileneed[i]))
using (var diskFile = File.OpenWrite(fileneed[i]))
{
webFile.CopyTo(diskFile);
}
fileneed.RemoveAt(i);
}
}
fileneed=fileneed.Distinct().ToList();
对于(int i=fileneed.Count-1;i>=0;i--)
{
if(fileneed[i]。包含(“.”)
{
使用(var w=new WebClient())
使用(var webFile=w.OpenRead(“http://mywebsite.org/collab/files.php?act=need&user=“+Properties.Settings.Default.user+”&file=“+fileneed[i]))
使用(var diskFile=File.OpenWrite(fileneed[i]))
{
webFile.CopyTo(diskFile);
}
fileneed.RemoveAt(i);
}
}
示例代码有几处错误:
第一:因为它正在从列表中读取内容的同时从fileneed
列表中删除项目,所以它将跳过列表中的文件。这是因为当您删除一个项目时,以下所有项目的索引都会变小一个。我们可以通过从头到尾迭代列表来解决这个问题
第二:虽然代码正在从服务器读取文件,但它并没有对文件执行任何操作以将其写入磁盘。因此,文件将丢失。这可以通过打开文件流并复制到其中来解决
第三:WebClient
和从OpenRead
返回的流需要被删除。否则,它们使用的资源将不会被清理,您的程序将成为内存/连接占用者。这是通过使用语句修复的
通过这三个修复,生成的代码如下所示:
fileneed = fileneed.Distinct().ToList<string>();
for (int i = fileneed.Count - 1; i >= 0; i--)
{
if (fileneed[i].Contains("."))
{
using (var w = new WebClient())
using (var webFile = w.OpenRead("http://mywebsite.org/collab/files.php?act=need&user=" + Properties.Settings.Default.user + "&file=" + fileneed[i]))
using (var diskFile = File.OpenWrite(fileneed[i]))
{
webFile.CopyTo(diskFile);
}
fileneed.RemoveAt(i);
}
}
fileneed=fileneed.Distinct().ToList();
对于(int i=fileneed.Count-1;i>=0;i--)
{
if(fileneed[i]。包含(“.”)
{
使用(var w=new WebClient())
使用(var webFile=w.OpenRead(“http://mywebsite.org/collab/files.php?act=need&user=“+Properties.Settings.Default.user+”&file=“+fileneed[i]))
使用(var diskFile=File.OpenWrite(fileneed[i]))
{
webFile.CopyTo(diskFile);
}
fileneed.RemoveAt(i);
}
}
“但是在1个元素之后,循环停止(可能)”-为什么不连接调试器并确保它停止?您也不应该在遍历列表时从列表中删除项目。如果删除项0,则项1将成为项0,但您的i
从不递减。您需要向后迭代循环:for(int i=fileneed.Count-1;i>=0;i--)。当您有一个列表1、2、3、4和delete 2时,3变为2,因此您可以跳过删除3。“但是在1元素之后,循环的元素被停止(可能)”-为什么不附加调试器并确保它停止?您也不应该在遍历列表时从列表中删除项目。如果删除项0,则项1将成为项0,但您的i
从不递减。您需要向后迭代循环:for(int i=fileneed.Count-1;i>=0;i--)。当您有一个列表1、2、3、4并删除2时,3变为2,因此您可以跳过删除3。