Причина сбоя программирования неизвестна - PullRequest
0 голосов
/ 19 августа 2011

Итак, у меня есть базовое приложение, написанное на 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);

    }
}

Ответы [ 2 ]

1 голос
/ 19 августа 2011

Вот мое лучшее предположение, основанное на том факте, что у вас есть МНОГО дополнительного кода, который мы не можем интерпретировать, не увидев весь код (именно поэтому лучше опубликовать самый минимальный пример, воссоздающий проблему как Jon Скит так чудесно сформулировал в своем блоге Написание идеального SO вопроса ).

Но вот мое предположение. Я догадываюсь и очень сильно чувствую, что у вас здесь безудержная рекурсия. Ваш метод 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 () попыткой / уловкой, чтобы вы могли хотя бы увидеть исключение на экране и узнать, в какой строке оно происходит.

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

Однако, если это рекурсия, вызывающая исключение StackOverflowException, CLR завершит ваш процесс. В этом случае закомментируйте эти рекурсивные вызовы и подумайте, что вы действительно пытаетесь сделать. Я не думаю, что вы действительно хотите сделать рекурсию в этом случае. Вы просто пытаетесь «повторить»?

0 голосов
/ 19 августа 2011

Любое необработанное исключение, которое возникает в задаче, поставленной в очередь в ThreadPool, приведет к закрытию вашего приложения.Поместите все тело вашего scraping1 метода в блок try / catch, установите точку останова в верхней части catch, и вы должны хотя бы увидеть, какое исключение выдается.

...