繁体   English   中英

在没有 try-catch 的情况下将异常处理为 System.OutOfMemoryException

[英]handling the exception as System.OutOfMemoryException without try-catch

我开发了创建线程数的 C# 应用程序,经过一段时间后,它在创建新线程时抛出 System.OutOfMemoryException 异常。任何想法来处理此异常。不使用 try-catch。 如何增加 memory 中的空间或如何从 memory 中释放线程。这东西处理得非常快。

private void DataChangeHandler(object sender, DataChangeEventArgs e)
        {         
            try
            {         update3(e);              
            }
            catch { }
        }

 public void update3(object h)
         {
             try
             {                                  
                     if (h != null)
                     {
                         DataChangeEventArgs e = (DataChangeEventArgs)h;
    OdbcConnection con128 = new OdbcConnection(LocalConnection.GetLocalConnetionString());
                         int counter = 0;
                         OdbcCommand cmd;
                         string UpdateQuery = "";
                         string query1 = "";
                         while (counter < e.sts.Length)
                         {
                             object val = e.sts[counter].DataValue;
                             int hour = e.sts[counter].TimeStampNet.Hour;
                             int minute = e.sts[counter].TimeStampNet.Minute;
                             int second = e.sts[counter].TimeStampNet.Second;
                             int millisecond = e.sts[counter].TimeStampNet.Millisecond;
                             int year = e.sts[counter].TimeStampNet.Year;
                             int month = e.sts[counter].TimeStampNet.Month;
                             int day = e.sts[counter].TimeStampNet.Day;
       DateTime sdate = new DateTime(year, month, day, hour, minute, second, millisecond);
                             string date = sdate.ToString("dd-MM-yyyy HH:mm:ss.fff");
                             DateTime dt = DateTime.FromFileTime(e.sts[counter].TimeStamp);
                             query1 += "select '" + val + "' as DTvalue ,'" + date + "' as DTdatelogged1,'" + OpcGroup.QualityToString(e.sts[counter].Quality) + "' as DTquality ,'" + dt + "' as DTtimestamp ,'" + e.sts[counter].HandleClient + "' as DTparamID Union " + Environment.NewLine;
                             counter++;
                         }

                         query1 = query1.Remove(query1.LastIndexOf("Union"));
                         UpdateQuery = "Update parameter t Left join " + Environment.NewLine;
                         UpdateQuery += " ( " + query1 + " ) Temp on" + Environment.NewLine;
                         UpdateQuery += "t.itemID=Temp.DTparamID" + Environment.NewLine;
                         UpdateQuery += "set paramvalue=DTvalue,date_logged1=DTdatelogged1,Quality=DTquality,date_logged=DTtimestamp " + Environment.NewLine;
                         UpdateQuery += "where t.itemID=Temp.DTparamID ";
                         if (con128.State == ConnectionState.Closed)
                             con128.Open();

                         cmd = new OdbcCommand(UpdateQuery, con128);
                         cmd.ExecuteNonQuery();

                         if ((con128.State == ConnectionState.Connecting) || (con128.State == ConnectionState.Open))
                         {
                             con128.Close();
                         }

                     }            


             }
             catch (Exception ex)
             {
                 MessageBox.Show(ex.Message);

             }
         }

数据更改处理程序每秒钟调用一次,这由 OPC 服务器(如计时器)完成

您应该控制和跟踪您创建的内容,而不是创建大量线程。 例如,使用线程池,甚至更好的任务并行库。

第二个想法是你不应该尝试从 OOM 异常中恢复,你应该提前做所有事情来避免它。

我非常怀疑是否有人能够在没有源代码的情况下为您提供一个非常通用的问题的“正确”答案。 我能做的最好的就是给出一些通用的指针:

  • 确保您处理尽可能多的 scope 对象。
  • 使用线程池 object 因为它只会分配系统可以处理的线程数。
  • 使用 memory 分析器查看哪些对象占用的空间最多。

现在您已经发布了一些代码:

该代码没有在任何地方显示您提到的许多线程的创建,但是有几点需要注意:

  1. OdbcCommandOdbcConnection都是IDisposable的,因此应该包装到using中,以确保正确释放任何(未管理的)资源。
  2. 考虑使用string.Format()而不是串联,以避免创建许多临时字符串。 我怀疑这真的会成为一个问题,但这样会更干净一些。

除此之外,您的代码看起来不包含任何 memory 泄漏。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM