首先 设定 线程池:
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);
}
下载方式即可