2011-08-19 115 views
0

所以我有一個用C#編寫的基本應用程序。它基本上寫了一個庫存文件。它會在創建文件時停下來。我對這裏發生的事情感到困惑,因爲如果我在IDE中運行它,它將停止工作。該文件在文件的不同停止處停止,因此它不是一個單獨的事件。如果使用不同的話,我正在使用線程池。我有一個循環遍歷文件並讀取文件並提示新線程。如果沒有錯誤,就很難調試某些東西。編程崩潰原因未知

static void Main(string[] args) 
    { 
     //string asins; 
     Readfile r = new Readfile(); 
     r.read(); 

     Console.WriteLine("Press any key to exit."); 
     System.Console.ReadKey(); 

     //Thread.Sleep(60000); 

     //createoutward c = new createoutward(); 
     // c.read(); 

     //p.print(s.scrap(r.read())); 

    } 

我的方法使得線程

public string[] read() 
    { 
     ThreadPool.SetMaxThreads(10, 100); 
     string[] asins; 

     string[] lines = System.IO.File.ReadAllLines(@"C:\Users\Joe T\Desktop\AmazonAsins.csv"); 

     using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"\\WIN-UWPWZ7Z3RKX\wwwroot\repricer\WriteLines2a.txt")) 
      file.WriteLine("Product-ID\tPrice1\tPrice2\tRank\tAFN\t" + DateTime.Now); 
     prices = new string[lines.Length, 2]; 
     int i = 0; 
     asins = new string[lines.Length]; 

     foreach (string line in lines) 
     { 
      scraping s = new scraping(); 


      char[] tabs = { '\t' }; 
      string asin; 
      string[] words = line.Split(tabs); 
      asin = words[1]; 
      asins[i] = asin; 

      Thread.Sleep(1000); 
      ThreadPool.QueueUserWorkItem(new WaitCallback(s.scraping1), asin); 

      ++i; 


     } 


     return asins; 
    } 

刮痧類

 public void scraping1(object a) 
    { 
     string AFN = "N"; 

     string asin = (string)a; 

     double price, price2; 
     string sprice; 
     string context; 
     string page = "*****" + asin; 
     try 
     { 
      WebZinc WebZincProduct = new WebZinc(); 
      WebZincProduct.OpenPage(page); 

      context = WebZincProduct.CurrentPage.Text; 
     } 
     catch 
     { 
      scraping1(a); 
      return; 
     } 

     Regex regex11 = new Regex("****\r\n((.|\n)*?)****", 
      RegexOptions.IgnoreCase); 
     Match oP1 = regex11.Match(context); 

     if (oP1.Value.Contains("*******")) 
     { 
      AFN = "Y"; 
     } 
     Regex reg = new Regex(@"[0-9]+\.[0-9]+"); 
     MatchCollection mc = reg.Matches(oP1.Value); 


     double cost = 0.0; 
     double cost2 = 0.0; 
     double shipping2 = 0.0; 
     double shipping = 0.0; 
     int j = 0; 
     int j3 = 0; 

     foreach (Match m in mc) 
     { 
      if (j == 0) cost = Convert.ToDouble(m.Value); 
      if (j == 1) shipping = Convert.ToDouble(m.Value); 
      Console.WriteLine("{0}", m.Value); 
      ++j; 
     } 


     Regex regex4 = new Regex("****\r\n\r\n((.|\n)*?)****", 
      RegexOptions.IgnoreCase); 
     Match oP4 = regex4.Match(context); 

     MatchCollection mc4 = reg.Matches(oP4.Value); 

     foreach (Match m in mc4) 
     { 
      if (j3 == 0) cost2 = Convert.ToDouble(m.Value); 
      if (j3 == 1) shipping2 = Convert.ToDouble(m.Value); 
      Console.WriteLine("{0}", m.Value); 
      ++j3; 
     } 



     price2 = cost2 + shipping2; 
     price = cost + shipping; 
     if (price == 0.0 && i != 5) 
     { 
      scraping1(a); 
     } 



     string rank = rankAFN(asin); 
     lock (Program._locker) 
     { 

       using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"\\WIN-UWPWZ7Z3RKX\wwwroot\repricer\WriteLines2a.txt", true)) 
        file.WriteLine(asin + "\t" + price + "\t" + price2 + "\t" + rank + "\t" + AFN); 

    } 
} 
+6

當我們看不到您的代碼時,也很難知道發生了什麼;) – slandau

+0

@slandau添加了代碼 –

+0

當您說你在IDE中運行它時,是否使用「開始調試」[F5]或「開始不調試「[Ctrl] + [F5] –

回答

1

這是我最好的猜測,基於這樣一個事實,即您在這裏有很多額外的代碼,我們無法在不看到整個代碼的情況下解釋這些代碼(這就是爲什麼最好發佈最簡單的示例來重新創建問題爲Jon Skeet在他的博客文章Writing the Perfect S.O. Question中如此精彩地表達)。

但這是我的猜測。我猜測,並感覺很強烈,你有這裏失控遞歸。您的方法scrapping1()對異常和某些未從參數解釋的條件進行遞歸調用。

因爲這些遞歸調用取決於局部變量或動作而不是參數,所以它使得很難安全地控制遞歸會做什麼,而且在這種情況下你可能不應該做它們。

catch 
    { 
     // recursion here passing the SAME arg, what is to stop this? 
     scraping1(a); 
     return; 
    } 

而且

// WHERE does this 'i' come from? I don't see where it's incrementing! 
    // possible unsafe recursion... 
    if (price == 0.0 && i != 5) 
    { 
     // recursion here passing the SAME arg, no stop condition? 
     scraping1(a); 
    } 

你可以做的是圍繞你的scraping1()方法的身體有一個try/catch這樣你至少可以看到屏幕上的異常,並知道什麼線的另一件事它發生在。

public void scraping1(object a) 
{ 
    try 
    { 
      // your method logic 
    } 
    catch (Exception ex) 
    { 
      Console.WriteLine(ex); 
      Console.Out.Flush(); 
    } 
} 

如果是遞歸,但是,導致StackOverflowException,CLR將終止您的進程。在這種情況下,註釋掉這些遞歸調用並思考你真正想做的事情。我不認爲你真的想在這種情況下做遞歸。你只是想「重試?」

+0

在刪除了遞歸,並添加了一些嘗試/捕獲的代碼行我想重試,而不是一遍又一遍地調用一個方法。 –

0

,在一個任務排隊到線程池會導致應用程序關閉時發生的任何未處理的異常。將你的scraping1方法的全部內容放在try/catch塊中,在catch的頂部設置一個斷點,並且至少應該能夠看到拋出的異常。