3dparty组件留下死线程

时间:2012-02-17 03:34:39

标签: c# .net multithreading wcf devart

当应用程序尝试连接到数据库服务器并检索某些数据时,它有时会引发异常,并且即使处理了expcetion,它似乎也会留下死线程。因此,大约有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 for Oracle

我该如何管理它? BeginConnect然后被EndConnect强行突破会有帮助吗?

1 个答案:

答案 0 :(得分:1)

获取固定库: - )

但是说真的。如果你有一个你必须使用的第三方库,不能改变它,哪个是错误的,我看到的唯一方法是在一个单独的AppDomain中运行它。域之间的通信比调用方法更困难,但仍然相对容易。例如,您可以使用WCF服务(使用命名管道)进行通信。

一旦您的代码在单独的AppDomain中处理讨厌的库,您就可以定期或在其他条件下回收(销毁和重新创建)该域。这会杀掉所有悬挂的线程,未发布的对象等。

这是一种解决方法类型的解决方案,但它应该至少为您提供一种方法。