2012-01-20 39 views
1

我有一个窗口服务,这是执行定期...这里是代码片段:Windows服务和mutilthreading

protected override void OnStart(string[] args) 
{ 
    tickTack = new Timer(10000); 
    tickTack.Elapsed += new ElapsedEventHandler(tickTack_Elapsed); 
    tickTack.Start(); 
} 

protected override void OnStop() 
{ 
    tickTack.Stop(); 
} 
private void tickTack_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    objProc = new Processing(); 
    objProc.start(); 
} 

在我处理类的start()方法做我的实际工作中像下面。

public void start() 
{ 
    try 
    { 
     Process_Requests(); 
     Process_Exports(); 
    } 
    catch (Exception ex) 
    { 
     ErrorLogs.SaveError(ex, ""); 
    } 
} 

执行在单线程中完成时如何发生?例如,第一种方法需要时间来执行,那么第二种方法呢?

现在我想拨打Process_request()Preocess_export()方法。每种方法都应连接到多个数据库。在这种情况下,我是否需要为每个连接创建新线程并开展工作......我不确定。

public void start() 
{ 
    try 
    { 
     #region 
     sqlConObjects = new List<SqlConnection>(); 

     // Here i am getting multiple connection strings 
     List<string> conStrings = GetConnectionStrings(); 
     foreach (string strCon in conStrings) 
     { 
      SqlConnection sqlCon = new SqlConnection(strCon); 
      sqlConObjects.Add(sqlCon); 
     } 

     foreach (SqlConnection sqlCon in sqlConObjects) 
     { 
      //sqlCon.Open(); 
      Thread t = new Thread(ProcessRequest); 
      t.Start((object)sqlCon); 

      Thread t1=new Thread(ProcessExports); 
      t1.Start((object)sqlCon); 
     } 
     #endregion 
    } 
    catch (Exception ex) 
    { 
     ErrorLogs.SaveError(ex, ""); 
    } 
} 

任何人都可以请解释如何做到这一点...是线程创建或不需要?如果我们不为每个连接对象创建线程,应该如何执行。

回答

0

计时器在ThreadPool上工作 来自MSDN 计时器执行的回调方法应该是可重入的,因为它是在ThreadPool线程上调用的。如果定时器间隔小于执行回调所需的时间,或者所有线程池线程正在使用且回调已多次排队,则可以在两个线程池线程上同时执行回调。

同样在你的代码中,你不会保持对定时器对象的引用,它将被收集。

至于我你应该使用ThreadPool。创建很多线程是不好的做法