现在的位置: 首页 > 综合 > 正文

C#多线程调用带参数的函数的另类解决方案

2013年05月05日 ⁄ 综合 ⁄ 共 3339字 ⁄ 字号 评论关闭
今天遇到了用线程调用带函数,但是如果运用常规想法是行不通的,如下代码:

            HistoryRecord hr = new HistoryRecord();
            DateTime StartTime 
= new DateTime(2007123161836);
            DateTime EndTime 
= new DateTime(2007124161959);

            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);               
            }

        }

 
之所以使用多线程,其中一部份原因是执行比较耗时的操作。上面的代码中是在类里使用了多线程而不是在类的外部。

如果大家有更好的方法或对于上面我所讲的2、3点大家能给个比较详细点例子吗?小弟在此谢过了!

【上篇】
【下篇】

抱歉!评论已关闭.