黑马程序员技术交流社区

标题: 关于反射问题,请高手解决啊! [打印本页]

作者: RogerZhang    时间: 2015-6-16 10:42
标题: 关于反射问题,请高手解决啊!
30个用户并发压力测试的时候,前20分钟,内存占用都正常,20分钟以后,内存狂飙,一直到内存消耗完为止。

如果 我在  "断点位置"直接返回,压力测试内存消耗正常。

测试时候,反射类里面不执行任何东西,就写了一个空函数,return "";

各位高手请帮忙,谢谢,分数不够在加。

从 FormDataCheck()方法开始调用。

public ArrayList FormDataCheck()
        {
            string strCheckErr = "";
            bool CheckResult = false;
            ArrayList arrResult = new ArrayList();
            try
            {

                ArrayList dsItems = new ArrayList();

                if (this.isinterface)
                {
                    dsItems = this.datasetitems;

                }

                else
                {
                    for (int i = 0; i < this.tables.Length; i++)
                    {
                        DataSet ds = GetData(tables[i]);
                        if (ds != null)
                        {
                            dsItems.Add(ds);
                        }
                    }
                }

                ReflectFormat reformat = new ReflectFormat();
                DataCheckDef ckDef = new DataCheckDef();
                DataCheckDef DataCheckDef = new DataCheckDef();
                ArrayList CheckItemList = ckDef.GetCheckConfig(this.wm_guid);
                if (CheckItemList.Count > 0)
                {
                    DataCheckDef = (DataCheckDef)CheckItemList[0];
                }
               
                reformat.ReflectDLLName = DataCheckDef.CheckReflectDll;
                string[] reflectArr = DataCheckDef.CheckReflectMethod.Split('|');
               
                //断点位置
               
                if (reflectArr.Length >= 3)
                {
                    reformat.NameSpace = reflectArr[0].ToString();
                    reformat.ClassName = reflectArr[1].ToString();
                    reformat.Method = reflectArr[2].ToString();
                    Reflect reflect = new Reflect();
                    
                    //反射调用
                     
                    strCheckErr += (string)reflect.ReflectMehod(reformat, this.tables, dsItems,
this.wm_guid, this.isinterface);
                }

                if (strCheckErr != "")
                {
                    InsertLog(strCheckErr);
                    UpdateState();
                    CheckResult = false;
                }
                else
                {
                    CheckResult = true;
                }
                arrResult.Add(CheckResult);
                arrResult.Add(strCheckErr);

                dsItems.Clear();
                dsItems=null;
            }
            catch (Exception ex)
            {
            }
            return arrResult;
        }



//反射类定义

using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using System.Reflection;
using System.Web.UI;
using System.Web;


namespace BizReflectWork
{
    public class ReflectFormat
    {
        string reletivePath = "";
        public string ReletivePath { get { return reletivePath; } set { reletivePath = value; } }
        string dllName = "";
        public string ReflectDLLName { get { return dllName; } set { dllName = value; } }
        string nameSpace = "";
        public string NameSpace { get { return nameSpace; } set { nameSpace = value; } }
        string className = "";
        public string ClassName { get { return className; } set { className = value; } }
        string method = "";
        public string Method { get { return method; } set { method = value; } }

    }


    class Reflect
    {

        #region 调用反射
        PublicMethod pm = new PublicMethod();

        private Type GetAssemblyType(ReflectFormat refFormat)
        {

            string strparth = System.Web.HttpContext.Current.Request.PhysicalApplicationPath + "Bin\\" + refFormat.ReflectDLLName;
            if (!System.IO.File.Exists(strparth))
                return null;
            Assembly MyAssembly = Assembly.LoadFrom(strparth);
            Type t = MyAssembly.GetType(refFormat.NameSpace + "." + refFormat.ClassName);

            return t;
        }

        /// <summary>
        /// 反射执行dll
        /// </summary>
        /// <param name="refFormat"></param>
        /// <param name="tables"></param>
        /// <param name="dsItems"></param>
        /// <param name="wmGUID"></param>
        /// <param name="IsInterface">是不是接口的检查</param>
        /// <returns></returns>
        public string ReflectMehod(ReflectFormat refFormat, string[] tables, ArrayList dsItems, string wmGUID, bool IsInterface)
        {
            string strtmp = "";
            try
            {
                Type t = GetAssemblyType(refFormat);
                if (t == null)
                    return null;
                object obj = Activator.CreateInstance(t);
                MethodInfo m;


                object[] param;
                if (IsInterface)
                {

                    m = t.GetMethod(refFormat.Method, new Type[] { typeof(string[]), typeof(ArrayList), typeof(string), typeof(bool) });
                    param = new object[4];
                    param[3] = true;
                }
                else
                {
                    m = t.GetMethod(refFormat.Method, new Type[] { typeof(string[]), typeof(ArrayList), typeof(string) });
                    param = new object[3];
                }
                param[0] = tables;
                param[1] = dsItems;
                param[2] = wmGUID;

                if (m != null)
                {
                    strtmp = (string)m.Invoke(obj, param);
                }

                return strtmp;
            }
            catch (Exception ex)
            {
                pm.SaveLog("BizReflectWork.Reflect", "ReflectMehod", ex.Message);
                return "系统发生错误,请与管理员联系!发生在\"BizReflectWork.Reflect\"";
            }
        }

        #endregion
    }
}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2