winform 资源释放问题

mingl11 2011-03-18 05:51:59
项目需求,做了一个小的winform,功能是定时扫描一个文件夹下的excel文件,将数据导入到数据库里。

做好以后,运行exe发现导入数据后exe占用内存很大不释放(好像最小化一下就释放了)! 导入的时候cpu也占用的厉害,这要如何解决?放上主要代码,大家帮忙看下。。。


#region 导数据
private void ImportData()
{

t.Stop();

this.BeginInvoke(new ChangeBtn(BtnEnable), button1, false);


string RootPath = txtFolderPath.Text;

if (!Directory.Exists(RootPath))
{
//MessageBox.Show(this,"文件夹不存在!");
this.BeginInvoke(new ShowMsg(AlertMsg));
this.BeginInvoke(new ChangeBtn(BtnEnable), button2, true);
return;
}

string[] ExcelPath = Directory.GetFiles(RootPath, txtFileName.Text);
if (ExcelPath != null && ExcelPath.Length > 0)
{
for (int i = 0; i < ExcelPath.Length; i++)
{

string oconnString = @"Provider=Microsoft.Jet.OLEDB.4.0; Persist Security Info=False;Data Source=" + ExcelPath[i] + "; Extended Properties='Excel 8.0;IMEX=1'";
OleDbConnection oconn = new OleDbConnection(oconnString);
oconn.Open();
OleDbCommand ocmd = new OleDbCommand("select * from [Sheet1$]", oconn);
DataTable odt = new DataTable();
OleDbDataReader odr = ocmd.ExecuteReader();
odt.Load(odr);

SqlBulkCopyColumnMapping[] mapcol = new SqlBulkCopyColumnMapping[]
{
new SqlBulkCopyColumnMapping("Name", "AdminName"),
new SqlBulkCopyColumnMapping("Password", "AdminPwd"),
new SqlBulkCopyColumnMapping("Level", "AdminLevel")
};

ImporyBigData(odt, mapcol, "Manage");
ocmd.Dispose();
oconn.Close();
oconn.Dispose();

string oldFilePath = txtOldFileFolder.Text.Trim();
if (!Directory.Exists(oldFilePath))
{
Directory.CreateDirectory(oldFilePath);
}
File.Move(ExcelPath[i], oldFilePath + Path.GetFileName(ExcelPath[i]));
}

//MessageBox.Show("OK!");
}
t.Start();
this.BeginInvoke(new ChangeBtn(BtnEnable), button1, true);

}
#endregion

#region 导入大量数据方法
private void ImporyBigData(DataTable dt, SqlBulkCopyColumnMapping[] mapcol, string tabName)
{
SqlConnection SqlConn = null;

using (SqlConn = OpenConn())
{

using (SqlTransaction tran = SqlConn.BeginTransaction())
{

SqlBulkCopy bulkCopyOrders = new SqlBulkCopy(SqlConn, SqlBulkCopyOptions.Default, tran);
bulkCopyOrders.DestinationTableName = tabName;

for (int i = 0; i < mapcol.Length; i++)
{
bulkCopyOrders.ColumnMappings.Add(mapcol[i]);
}


bulkCopyOrders.BulkCopyTimeout = 1000;

try
{
bulkCopyOrders.WriteToServer(dt);
tran.Commit();
}
catch (Exception ex)
{

tran.Rollback();
throw ex;
}
finally
{
dt.Dispose();
bulkCopyOrders.Close();
if (SqlConn.State == ConnectionState.Open)
{
SqlConn.Close();
SqlConn.Dispose();
}
tran.Dispose();
}
}
}
}
#endregion
...全文
224 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
IHandler 2011-03-19
  • 打赏
  • 举报
回复

/// <summary>
/// 设置工作内存,降低内存占用
/// </summary>
/// <param name="maxWorkingSet">内存中允许的进程的最大工作集大小(以字节为单位)</param>
public static void SetWorkingSet(int maxWorkingSet)
{
System.Diagnostics.Process.GetCurrentProcess().MaxWorkingSet = (IntPtr)maxWorkingSet;
}
#endregion
mingl11 2011-03-19
  • 打赏
  • 举报
回复
winform能控制运行时使用的资源吗?
小童 2011-03-18
  • 打赏
  • 举报
回复
ocmd.Dispose();
oconn.Close();
oconn.Dispose();

都已经释放了。

你用ANTS Profiler或者dotTrace Profiler查看一下。占用资源情况、

或者像秋大那样强制回收。GC.Collect ()
ycproc 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wxr0323 的回复:]
ocmd.Dispose();
oconn.Close();
oconn.Dispose();

都已经释放了。

你用ANTS Profiler或者dotTrace Profiler查看一下。占用资源情况、

或者像秋大那样强制回收。GC.Collect ()
[/Quote]
+1
mingl11 2011-03-18
  • 打赏
  • 举报
回复
谢谢各位的解答,有没有什么办法让它少用点资源,慢点也行(不能太慢- -!)。
子夜__ 2011-03-18
  • 打赏
  • 举报
回复
ocmd.Dispose();
oconn.Close();
oconn.Dispose();

都已经释放了。

你用ANTS Profiler或者dotTrace Profiler查看一下。占用资源情况、

或者像秋大那样强制回收。GC.Collect ()
宝_爸 2011-03-18
  • 打赏
  • 举报
回复
看起来都该释放的都释放掉了。

可能还是托管堆里的东西还没有释放,一般不用太管它,垃圾收集会处理的。

如果想强制释放内存,可以是试一试GC.Collect ()

CPU占用也没有办法,因为你的程序在运算。
walkghost 2011-03-18
  • 打赏
  • 举报
回复
试试:

string[] ExcelPath = Directory.GetFiles(RootPath, txtFileName.Text);
if (ExcelPath != null && ExcelPath.Length > 0)
{
for (int i = 0; i < ExcelPath.Length; i++)
{
System.Threading.Thread.Sleep(20);//休眠一下再继续干活儿

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧