我在随机时间得到了上面的错误。有一次,机器人在没有上述情况下收集200k链接的点而不是在某些点上它在80k时给出80k的错误等等。所以它是随机的。
搜索错误我读到,某些线程卡在某些东西中并且反复调用自身会导致此错误。
所以我经历了我的所有代码但是我没有看到任何while或其他循环,除了主要的顶级启动线程之外可以是无限循环?
这是主要代码:首先我启动线程:
for (int j = 0; j < 10; j++)
{
Console.Write("STARTING THREADS " + j);
Thread thread = new Thread(() => startPosting2());
thread.IsBackground = true;
thread.Start();
Random rnd = new Random();
int x = 0;
x = rnd.Next(1, 10);
System.Threading.Thread.Sleep(1000 * x);
}
比刮痧:
static int rowCounter = -1;
int totalRows = 0;
static private Object thisLock = new Object();
public void startPosting2()
{
while (rowCounter < urlList.Count)
{
try
{
//List<Thread> threads = new List<Thread>();
int tmprowCounter = 0;
lock (thisLock)
{
rowCounter = rowCounter + 1;
tmprowCounter = rowCounter;
}
string url = urlList[tmprowCounter].ToString();
scrapsomething(url);
}
catch(Exception ex)
{}
}
上面是唯一的while循环,但它获得了更多的链接,因为当它进入循环时总行数可以是100并且可以是100k并且它仍然在循环中直到它不断获取其中的链接继续添加到 urlList 。这可能是原因,编码是不是很糟糕?
更新
如果我将上述代码更改为以下内容该怎么办:
static int rowCounter = -1;
int totalRows = 0;
static private Object thisLock = new Object();
public void startPosting2()
{
while (rowCounter < urlList.Count)
{
try
{
//List<Thread> threads = new List<Thread>();
int tmprowCounter = 0;
lock (thisLock)
{
rowCounter = rowCounter + 1;
tmprowCounter = rowCounter;
}
string url = urlList[tmprowCounter].ToString();
Thread t = new Thread(() => scrapeSiteCollectLinks(url));
t.Start();
t.Join(60000);
}
catch(Exception ex)
{}
}
这会有帮助!好像有什么东西被卡住了,它必须在60秒后退出?这个逻辑是否正确?