今天遇到的备份列队下载太多造成内存过大的问题(使用多线程,线程池,清理内存)

首先 设定 线程池:

ThreadPool.SetMaxThreads(5, 10);//线程池5个活跃,最大10个线程

线程方法的使用:

foreach (FujianInfo OneItem in bakFujianList)
                        {
                            SetPBValue(i);
                            OneItem.Tag = DownStr;
                            SetBZValue("正在操作:" + OneItem.FileName);
                            ThreadPool.QueueUserWorkItem(new WaitCallback(ThrundDo), OneItem);//执行
                            //SetBZValue("正在操作:" + OneItem.FileName);
                            //CommMsg MsgCom = new WebDavUpDown().DownloadFile(OneItem.FujianAdd, DownStr);//保存文件
                            //if (MsgCom.Success)
                            //{
                            //    IdsList.Add(OneItem.Id);
                            //    OKCount++;
                            //}
                            //else
                            //{
                            //    OPCommon.LogWrite.WriteLog($"附件数据Id为{OneItem.Id},名称为{OneItem.FileName} 下载失败!" + MsgCom.ErrMsg);
                            //    ErrorCount++;
                            //}
                            i++;
                            //GC.Collect();
                            //GC.SuppressFinalize(this);
                            if (Environment.OSVersion.Platform == PlatformID.Win32NT)
                            {
                                SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
                            }
                            //EmptyWorkingSet(System.Diagnostics.Process.GetCurrentProcess().Handle);
                            Thread.Sleep(100);
                        }

其中这里用到了清除缓存的方法:

 if (Environment.OSVersion.Platform == PlatformID.Win32NT)
                            {
                                SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);///清除缓存的方法
                                //EmptyWorkingSet(System.Diagnostics.Process.GetCurrentProcess().Handle);
                            }

清除缓存在文件头需要引入dll操作:

 [System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize", ExactSpelling = true, CharSet =
System.Runtime.InteropServices.CharSet.Ansi, SetLastError = true)]
        private static extern int SetProcessWorkingSetSize(IntPtr process, int minimumWorkingSetSize, int maximumWorkingSetSize);


        //[DllImport("psapi.dll")]
        //static extern int EmptyWorkingSet(IntPtr hwProc);

以下是线程处理=方法:对象是以object 方式传入的。

 /// <summary>
        /// 线程池操作
        /// </summary>
        /// <param name="o"></param>
        public void ThrundDo(object o)
        {
            FujianInfo OneItem = o as FujianInfo;

            CommMsg MsgCom = new WebDavUpDown().DownloadFile(OneItem.FujianAdd, OneItem.Tag);//保存文件
            if (MsgCom.Success)
            {
                IdsList.Add(OneItem.Id);
                OKCount++;
            }
            else
            {
                OPCommon.LogWrite.WriteLog($"附件数据Id为{OneItem.Id},名称为{OneItem.FileName} 下载失败!" + MsgCom.ErrMsg);
                ErrorCount++;
            }
            Thread.Sleep(100);
        } 

下载方式即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值