未处理的类型' System.StackOverflowException'在代码中

时间:2014-03-21 04:55:48

标签: c# multithreading winforms visual-studio-2010 debugging

我在随机时间得到了上面的错误。有一次,机器人在没有上述情况下收集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秒后退出?这个逻辑是否正确?

0 个答案:

没有答案