今天遇到了用线程调用带函数,但是如果运用常规想法是行不通的,如下代码:
HistoryRecord hr = new HistoryRecord();
DateTime StartTime = new DateTime(2007, 12, 3, 16, 18, 36);
DateTime EndTime = new DateTime(2007, 12, 4, 16, 19, 59);
Thread t = new Thread(hr.DeleteHistoryRecord(StartTime, EndTime));
DateTime StartTime = new DateTime(2007, 12, 3, 16, 18, 36);
DateTime EndTime = new DateTime(2007, 12, 4, 16, 19, 59);
Thread t = new Thread(hr.DeleteHistoryRecord(StartTime, EndTime));
上面的代码是有语法错误的,线程调用函数是带参数的的!就此在网上找了很长时间,大概有如下几种方法:
1、在构造函数中传入参数
2、利用线程池
3、利用代理
可能是我C#学得太浅了,第2、3种方法没有弄得很明白;对于第1种方法,如果类中的方法需要调用多次且多次调用的参数不一样,那么第1种方法就不合适了,对此我是这样想的:在类里写两个函数,一个私有、一个公共函数、两个成员变量。其公共函数有两个参数。我们可以利用从全局函数然传入参数,将参数值赋值给两个成员变量,然后在公共方法里调用私有方法,其中私有方法实现我们要实现的功能。
下面的代码:
/// <summary>
/// 删除历史记录(内部操作已用线程实现),请设置日期的时、分、秒
/// </summary>
/// <param name="StartDateTime">开始的日期、时间</param>
/// <param name="EndDateTime">结束的日期、时间</param>
/// <returns></returns>
public void DeleteHistoryRecord(DateTime StartDateTime, DateTime EndDateTime)
{
/* 删除历史记录只能从第一条开始删除
* 如果删除的历史记录的开始时间>第一条历史记录的时间则退出
* */
//获取历史记录的第一条记录的日期
string str = "select top 1 时间 from 电流";
DateTime FirstDateTime = (DateTime)db.ExeScalar(str) ;
if (StartDateTime > FirstDateTime)
{
return;
}
m_StartDateTime = StartDateTime;
m_EndDateTime = EndDateTime;
try
{
Thread t = new Thread(DeleteHistory);
t.Start();
}
catch (Exception exp)
{
Log.WriteLog(Log.LogType.ErrorLog, "DeleteHistoryRecord:"+exp.Message);
}
}
/// <summary>
/// 删除历史记录
/// </summary>
private void DeleteHistory()
{
SwapDateTime(ref m_StartDateTime, ref m_EndDateTime);
string sql_dianliu = "delete 电流 where 时间 between '" + m_StartDateTime + "' and '" + m_EndDateTime + "'";
string sql_gunfen = "delete 辊缝 where 时间 between '" + m_StartDateTime + "' and '" + m_EndDateTime + "'";
string sql_yali = "delete 压力 where 时间 between '" + m_StartDateTime + "' and '" + m_EndDateTime + "'";
string sql_shijiali = "delete 施加力 where 时间 between '" + m_StartDateTime + "' and '" + m_EndDateTime + "'";
string sql_jiejingqi = "delete 结晶器 where 时间 between '" + m_StartDateTime + "' and '" + m_EndDateTime + "'";
string sql_other = "delete 其它 where 时间 between '" + m_StartDateTime + "' and '" + m_EndDateTime + "'";
//如果不对日志文件进行清理的话,那么时间长了,LDF文件就会变得很大,以下操作是对日志进行截断处理
string sql_backuplog = "BACKUP LOG SoftPress WITH TRUNCATE_ONLY";
string sql_dbcc = "DBCC ShrinkDatabase(SoftPress)";
try
{
db.ExecCommand(sql_dianliu);
db.ExecCommand(sql_gunfen);
db.ExecCommand(sql_jiejingqi);
db.ExecCommand(sql_other);
db.ExecCommand(sql_shijiali);
db.ExecCommand(sql_yali);
db.ExecCommand(sql_backuplog);
db.ExecCommand(sql_dbcc);
}
catch (Exception exp)
{
Log.WriteLog(Log.LogType.ErrorLog, "DeleteHistory:" + exp.Message);
}
}
/// 删除历史记录(内部操作已用线程实现),请设置日期的时、分、秒
/// </summary>
/// <param name="StartDateTime">开始的日期、时间</param>
/// <param name="EndDateTime">结束的日期、时间</param>
/// <returns></returns>
public void DeleteHistoryRecord(DateTime StartDateTime, DateTime EndDateTime)
{
/* 删除历史记录只能从第一条开始删除
* 如果删除的历史记录的开始时间>第一条历史记录的时间则退出
* */
//获取历史记录的第一条记录的日期
string str = "select top 1 时间 from 电流";
DateTime FirstDateTime = (DateTime)db.ExeScalar(str) ;
if (StartDateTime > FirstDateTime)
{
return;
}
m_StartDateTime = StartDateTime;
m_EndDateTime = EndDateTime;
try
{
Thread t = new Thread(DeleteHistory);
t.Start();
}
catch (Exception exp)
{
Log.WriteLog(Log.LogType.ErrorLog, "DeleteHistoryRecord:"+exp.Message);
}
}
/// <summary>
/// 删除历史记录
/// </summary>
private void DeleteHistory()
{
SwapDateTime(ref m_StartDateTime, ref m_EndDateTime);
string sql_dianliu = "delete 电流 where 时间 between '" + m_StartDateTime + "' and '" + m_EndDateTime + "'";
string sql_gunfen = "delete 辊缝 where 时间 between '" + m_StartDateTime + "' and '" + m_EndDateTime + "'";
string sql_yali = "delete 压力 where 时间 between '" + m_StartDateTime + "' and '" + m_EndDateTime + "'";
string sql_shijiali = "delete 施加力 where 时间 between '" + m_StartDateTime + "' and '" + m_EndDateTime + "'";
string sql_jiejingqi = "delete 结晶器 where 时间 between '" + m_StartDateTime + "' and '" + m_EndDateTime + "'";
string sql_other = "delete 其它 where 时间 between '" + m_StartDateTime + "' and '" + m_EndDateTime + "'";
//如果不对日志文件进行清理的话,那么时间长了,LDF文件就会变得很大,以下操作是对日志进行截断处理
string sql_backuplog = "BACKUP LOG SoftPress WITH TRUNCATE_ONLY";
string sql_dbcc = "DBCC ShrinkDatabase(SoftPress)";
try
{
db.ExecCommand(sql_dianliu);
db.ExecCommand(sql_gunfen);
db.ExecCommand(sql_jiejingqi);
db.ExecCommand(sql_other);
db.ExecCommand(sql_shijiali);
db.ExecCommand(sql_yali);
db.ExecCommand(sql_backuplog);
db.ExecCommand(sql_dbcc);
}
catch (Exception exp)
{
Log.WriteLog(Log.LogType.ErrorLog, "DeleteHistory:" + exp.Message);
}
}
之所以使用多线程,其中一部份原因是执行比较耗时的操作。上面的代码中是在类里使用了多线程而不是在类的外部。
如果大家有更好的方法或对于上面我所讲的2、3点大家能给个比较详细点例子吗?小弟在此谢过了!