2011-08-27 79 views
0

我有這種場景,服務器上運行的是Windows服務。每隔大約一小時它讀取一個日誌文件並將內容保存到db。 現在,將會有三個文件,這些文件必須被讀取並保存到三個不同的表格中。 (我會從配置文件中讀取這些連接字符串等)這可以通過我知道的線程來實現。所以我想在線程中調用現有的'readfile'方法。關於如何在c#中實現線程的問題

我不熟悉線程,但這是要走的路嗎?

NameValueConfigurationCollection config = ConfigurationManager.GetSection("LogDirectoryPath") as NameValueConfigurationCollection; 

      foreach (DictionaryEntry keyvalue in configs) 
      { 
       Thread t = new Thread(new ThreadStart(ExecuteProcess(keyvalue.Key.ToString()))); 
       t.IsBackground = true; 
       t.Start(); 

      } 


private void ExecuteProcess(string path) 
     { 
     var xPathDocument = new XPathDocument(path); 
      XPathNavigator xPathNavigator = xPathDocument.CreateNavigator(); 

     string connectionString = GetXPathQuery(
      xPathNavigator, 
      "/connectionString/@value"); 

     string commandText = GetXPathQuery(
      xPathNavigator, 
      "/commandText/@value"); 

     string filePath = GetXPathQuery(
      xPathNavigator, 
      "/filePath/@value"); 

     SqlConnection sqlConnection = new SqlConnection(connectionString); 
     sqlConnection.Open(); 

     ProcessFiles(sqlConnection, commandText, filePath); 
} 

是否必須使該方法爲靜態?那麼使用的變量呢?

回答

2

在.NET 4中,你可以利用任務並行庫對於這一點,所以你不會有明確創建線程,只是表達要在並行執行什麼樣的代碼

Parallel.ForEach(configs.Select(x => x.Key.ToString()), path => ExecuteProcess(path)); 
0

我個人的偏好是使用ThreadPool用於我希望在火災和忘記情況下並行運行的線程,例如像

foreach (DictionaryEntry keyvalue in configs) 
{ 
    ThreadPool.QueueUserWorkItem((state) => 
    { 
     ExecuteProcess(keyvalue.Key.ToString()); 
    }); 
} 

Parallel Task庫也很有用,但不能保證去並行,而是adapts,按我的理解,對處理器的數量。但是,它確實會再次同步所有工作線程。所以這取決於你想要達到什麼,