3dparty компонент оставляет мертвые нити - PullRequest
0 голосов
/ 17 февраля 2012

Хотя приложение пытается подключиться к серверу базы данных и получить некоторые данные, оно иногда вызывает исключение, и кажется, что оно оставляет мертвые потоки при возникновении исключения, даже когда оно обрабатывается.Таким образом, около 300 потоков прекращают работу.

Вот код, периодически запускаемый по таймеру:

Parallel.ForEach(dbs, pair =>
        {
            db l = pair.Value;

            if (String.IsNullOrEmpty(l.city))
                l.city = l.configCity;

            using (OracleConnection conn = new OracleConnection(l.connString))
            {
                try
                {                        
                    conn.Open();
                }
                catch (Exception exc)
                {
                    Console.WriteLine(String.Format("({0}, {1}): {2}{3}", l.connAlias, l.lid, exc.Message, Environment.NewLine));                        
                }

                try
                {
                    if ((conn != null) && (conn.State == ConnectionState.Open))
                    {        
                        // This method just call stored procedure and then set received data to 'l' object                    
                        if (!DbConnection.SetBadicData(conn, ref l))
                        {
                            Console.WriteLine(String.Format("Couldn't refresh basic data on ({0}, {1})", l.connAlias, l.id));
                        }                            

                        // This method also just call procedure and set received data to object
                        if (!DbConnection.SetExtendedData(conn, ref l))
                        {
                            Console.WriteLine(String.Format("Couldn't refresh advanced data on ({0}, {1})", l.connAlias, l.lid));
                        }
                    }
                }
                catch (Exception exc)
                {
                    Console.WriteLine(String.Format("({0}, {1}): {2}{3}", l.connAlias, l.lid, exc.Message, Environment.NewLine));
                }
            }

        });

Исключения составляют:

  • Попытка чтения илиЗапишите защищенную память.Это часто указывает на то, что другая память повреждена
  • Внутреннее исключение в клиенте Oracle
  • SEHException - Внешний компонент выдал исключение

Компонент, который использовался для подключения кбаза данных devArt dotConnect для Oracle .

Как мне это сделать, ребята?Поможет ли BeginConnect, а затем принудительный взлом EndConnect?

1 Ответ

1 голос
/ 17 февраля 2012

Получить фиксированную библиотеку: -)

А если серьезно. Если у вас есть сторонняя библиотека, которую вы должны использовать, не можете ее изменить и которая содержит ошибки, я вижу только один способ - запустить ее в отдельном домене приложений. Связь между доменами сложнее, чем просто вызов метода, но все же относительно проста. Например, вы можете использовать службу WCF (с именованным каналом) для связи.

Если ваш код обрабатывает неприятную библиотеку в отдельном домене приложений, вы можете перерабатывать (уничтожать и воссоздавать) этот домен периодически или при других условиях. Это уничтожит все висящие нити, невыпущенные объекты и т. Д.

Это обходное решение, но оно должно дать вам хотя бы выход из этого.

...