C#WebClient多执行

C#WebClient多执行,c#,webclient,C#,Webclient,我的网络客户端有问题 简单我检查一个文件夹中丢失的文件。如果我没有这个文件,使用WebClient,我会导航到web页面并发送一个值来执行查询并将该值存储在数据库中 我的问题是: 例如,我有一个1500个元素的列表。 但在第一个元素之后,for循环停止(可能)或不再导航 我的代码: List<string> fileneed = new List<string>(); List fileneeded=new List(); 在线程中 //Distinct

我的网络客户端有问题

简单我检查一个文件夹中丢失的文件。如果我没有这个文件,使用WebClient,我会导航到web页面并发送一个值来执行查询并将该值存储在数据库中

我的问题是:

例如,我有一个1500个元素的列表。 但在第一个元素之后,for循环停止(可能)或不再导航

我的代码:

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。