C#线程并行问题

时间:2016-06-20 21:35:13

标签: c#

非常欢迎帮助,非常感谢,谢谢。这个程序是什么,是一个ProxyChecker,因为我买了一堆,并将继续使用不同的用户/通行证等代理,但有些已经过期。我添加了一个断点,它正在做的事实上是跳过ProxyClient代码并直接找到1中的每个var项,如果item接受连接等,那么它只返回false并结束。

private static void CheckProxy(object state)
{
    var u = user[0];
    var p = pass[0];
    var l = new List<MyIP>();
    Parallel.ForEach(l.ToArray(), (ip_item) =>
    {
        try
        {
            string ip = ip_item.IP;
            using (var client = new ProxyClient(ip, u, p))
            {
                Console.WriteLine(ip, user, pass);
                client.Connect();
                ip_item.AcceptsConnection = client.IsConnected;
            }
        }
        catch
        {
            l.Remove(ip_item);
        }
    });
    foreach (var item in l)
    {
        if (item.AcceptsConnection == true)
        {
            WriteToFile(user[0], pass[0]);
        }
        Console.WriteLine(item.IP + " is " + (item.AcceptsConnection) + " accepts connections" + " doesn not accept connections");
    }
}

加载ips功能:#

private static void loadips()
        {
            using (TextReader tr = new StreamReader("ips.txt"))
            {
                var l = new List<MyIP>();
                string line = null;
                while ((line = tr.ReadLine()) != null)
                {
                    l.Add(new MyIP { IP = line });
                }
            }
        }

我已经添加了这个以回答答案。我相信这是一个变量问题,因为变量在本地宣布不公开任何想法如何解决?我无法找到一种方法让这种工作看起来像是我愚蠢。感谢。

1 个答案:

答案 0 :(得分:1)

问题在于以下两行:

var l = new List<MyIP>();
Parallel.ForEach(l.ToArray(), (ip_item) =>

您刚刚创建了l作为新列表,其中没有任何项目。调用ToArray()将为您提供一个空数组。当Parallel.ForEach看到一个空数组时,它就会被跳过,因为没有什么东西可以迭代。