Как исправить остановку приложения c # после X раз работы - PullRequest
0 голосов
/ 11 февраля 2019

Я создаю консольное приложение на c #, оно читает некоторые файлы и выполняет цикл for, и в каждом из них я вызываю метод, через несколько часов приложение перестало работать или перестало работать подключение к Интернету на сервере:

namespace Sample
{
    class Program
    {
        public static void Main(string[] args)
        {

            string contents = File.ReadAllText(@"threads.txt");

            if(contents != null) {
                ThreadPool.SetMaxThreads(Convert.ToInt32(contents), Convert.ToInt32(contents));
            }


            foreach (string user in File.ReadLines("x.txt"))
            {


                foreach (string pass in File.ReadLines("y.txt"))
                {

                    foreach (string line in File.ReadLines("z.txt"))
                    {

                        ThreadPool.QueueUserWorkItem(tesTConn, new object[] { a, b, c, d });
                        Thread.Sleep(50);
                    }
                    ///////////////////////////////////////////////////////////////////
                }
            }
            Console.WriteLine("Press ENTER to exit.");
            Console.Read();


        }

        //string domain, int port, string username, string password

          public static void tesTConn(object state)
    {
        try
        {

            object[] array = state as object[];
            string domain = Convert.ToString(array[0]);
            int port = Convert.ToInt32(array[1]);
            string username = Convert.ToString(array[2]);
            string password = Convert.ToString(array[3]);

            Console.WriteLine("Working with IP:" + domain + " | User :" + username + " | Pass:" + password);

            //  SipClient client = new SipClient(domain, port, username, password);
            SipClient client = new SipClient(domain, port, "0", "0");

            client.Connect();
            // Contact[] contacts = client.GetRegisteredContacts("sip:" + domain, "sip:" + username + "@" + domain);
            Contact[] contacts = client.GetRegisteredContacts("sip:" + domain, "sip:0@" + domain);

            if (!(contacts != null && contacts.Length > 0))
            {

                SipClient client1 = new SipClient(domain, port, username, password);
                client1.Connect();
                Contact[] contacts1 = client1.GetRegisteredContacts("sip:" + domain, "sip:" + username + "@" + domain);

                if ( contacts1.Length > 0)
                {
                    string path = @domain + ".txt";
                    if (!File.Exists(path))
                    {
                        using (var tw = new StreamWriter(path, true))
                        {
                            tw.WriteLine(domain);
                            tw.WriteLine(domain + " : " + username + " : " + password);
                        }

                    }
                    else if (File.Exists(path))
                    {
                        using (var tw = new StreamWriter(path, true))
                        {
                            tw.WriteLine(domain + " : " + username + " : " + password);
                        }
                    }
                }
                client1.Disconnect();

            }
            client.Disconnect();
            return;
        }
        catch { }
        finally { }
    }
    }
}

Я хотел бы знать, как решить эту проблему, используя сборку мусора или любую другую технику?

1 Ответ

0 голосов
/ 11 февраля 2019

Не уверен, что это ваша проблема, но вы не должны устанавливать такие потоки пула потоков или ставить в очередь достаточно работы, чтобы максимизировать пул потоков.Вместо этого установите MaxDegreeOfParallelism и позвольте CLR управлять пулом потоков.EG

public static void Main(string[] args)
{

    int threads = Convert.ToInt32(File.ReadAllText(@"threads.txt"));

    var workItems = new List<object>();

    foreach (string user in File.ReadLines("x.txt"))
    {
        foreach (string pass in File.ReadLines("y.txt"))
        {
            foreach (string line in File.ReadLines("z.txt"))
            {
                workItems.Add(new object[] { user, pass, line });
            }
        }
    }
    var opts = new ParallelOptions() { MaxDegreeOfParallelism = threads };
    var results = Parallel.ForEach(workItems, opts, DoWork);

    Console.WriteLine("Press ENTER to exit.");
    Console.Read();


}

private static void DoWork(object state)
{
    //whatever 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...