2013-07-19 26 views
0

我有一個函數可以獲取FTP文件夾中存在的文件列表。找不到時間消耗的地方

功能:

public static List<string> GetFileList(NetworkCredential credential, string FTPSite, string FTPFolder, string extension) 
    { 
     string LSOutput = ""; 
     List<string> files = new List<string>(); 
     bool isSuccess = false; 
     int retrier = 1; 

     while (isSuccess == false && retrier <= MaxRetries) 
     { 
      try 
      { 
       CommonHelper.PrepareLogAndEmail("--Attempt " + retrier + ":", LogMessageType.Simple); 

       FtpWebRequest request = (FtpWebRequest)WebRequest.Create(@"ftp://" + FTPSite + FTPFolder); 
       request.Timeout = 120000; 
       request.Credentials = credential; 
       request.UseBinary = true; 
       request.EnableSsl = true; 
       request.Method = WebRequestMethods.Ftp.ListDirectory; 
       FtpWebResponse response = null; 
       response = (FtpWebResponse)request.GetResponse(); 
       Stream responseStream = response.GetResponseStream(); 
       StreamReader reader = new StreamReader(responseStream); 
       LSOutput = reader.ReadToEnd(); 
       reader.Close(); 
       response.Close(); 

       CommonHelper.PrepareLogAndEmail("--Succeeded", LogMessageType.Simple); 
       isSuccess = true; 
      } 
      catch (Exception ex) 
      { 
       CommonHelper.PrepareLogAndEmail("--Failed. Details: " + ex.Message, LogMessageType.Error); 
      } 

      retrier++; 
     } 

     if (!isSuccess) 
      throw new Exception("All attempts failed"); 
     else 
     { 
      //Parse the LS 
      string[] LSOutputLines = LSOutput.Trim().Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); 
      foreach (string LSOutputLine in LSOutputLines) 
       files.Add(LSOutputLine); 

      //Filter files 
      files = files.Where(f => f.ToLower().EndsWith(extension.ToLower())).ToList(); 

      PrepareLogAndEmail("Total " + extension.ToLower() + " files found: " + files.Count, LogMessageType.Simple); 
      return files; 
     } 
    } 

下面是它是如何叫:

 //-------------------------------------------------------// 
     startTime = DateTime.Now; 
     try 
     { 
      CommonHelper.PrepareLogAndEmail("Step 1: FIND FILES ON THE FTP FOLDER", CommonHelper.LogMessageType.StepStart); 
      filesOnFolder = CommonHelper.GetFileList(credential, FTPSite, FTPFolder, ".pgp"); 

      if (filesOnFolder.Count == 0) 
      { 
       CommonHelper.PrepareLogAndEmail("Atleast one file was expected but not found", CommonHelper.LogMessageType.Simple); 
       CommonHelper.PrepareLogAndEmail("Step 1: COMPLETED", CommonHelper.LogMessageType.StepComplete); 
       CommonHelper.PrepareLogAndEmail("(Took " + (DateTime.Now - startTime).TotalSeconds + " seconds to complete)", CommonHelper.LogMessageType.TimeTaken); 
       CommonHelper.PrepareLogAndEmail(HeaderMessage, CommonHelper.LogMessageType.Header); 

       CommonHelper.SendMail(CommonHelper.EmailSubjectType.Informative); 
       Environment.Exit(1); 
      } 
      else 
      { 
       CommonHelper.PrepareLogAndEmail("Step 1: COMPLETED", CommonHelper.LogMessageType.StepComplete); 
       CommonHelper.PrepareLogAndEmail("(Took " + (DateTime.Now - startTime).TotalSeconds + " seconds to complete)", CommonHelper.LogMessageType.TimeTaken); 
      } 
     } 
     catch (Exception ex) 
     { 
      CommonHelper.PrepareLogAndEmail("An exception occured. Details: " + ex.Message, CommonHelper.LogMessageType.Error); 
      CommonHelper.PrepareLogAndEmail("Step 1: COMPLETED WITH ERRORS", CommonHelper.LogMessageType.StepComplete); 
      CommonHelper.PrepareLogAndEmail("(Took " + (DateTime.Now - startTime).TotalSeconds + " seconds to complete)", CommonHelper.LogMessageType.TimeTaken); 
      CommonHelper.PrepareLogAndEmail(HeaderMessage, CommonHelper.LogMessageType.Header); 

      CommonHelper.SendMail(CommonHelper.EmailSubjectType.Bad); 
      Environment.Exit(1); 
     } 
     //-------------------------------------------------------// 

在某些情況下,我得到的輸出:

Step 1: FIND FILES ON THE FTP FOLDER 
--Attempt 1: 
--Succeeded 
Total .pgp files found: 2 
Step 1: COMPLETED 
(Took 4.2742904 seconds to complete) 

一個輸出的是這樣的:

Step 1: FIND FILES ON THE FTP FOLDER 
--Attempt 1: 
--Failed. Details: The operation has timed out 
--Attempt 2: 
--Succeeded 
Total .pgp files found: 0 
Atleast one file was expected but not found 
Step 1: COMPLETED 
(Took 370.6597195 seconds to complete) 

第一次嘗試120秒
第二次嘗試(最壞情況):119秒
總:239秒

額外的時間(370-239):131秒

我不知道這個地方131花了幾秒鐘。
PrepareLogAndEmail =將字符串記錄到文本文件的函數。
MaxRetries = 3

+0

http://www.jetbrains.com/profiler/使用它來找出:)它會找到耗時的方法 – wudzik

+3

在vstudio中使用探查器 –

+0

我不喜歡使用Environment.Exit(),也是如何你在做測試嗎?運行調試/發佈可執行文件? –

回答

0

使用System.Diagnostics.Stopwatch代替的DateTime;

// Create new stopwatch 
Stopwatch stopwatch = new Stopwatch(); 

// Begin timing 
stopwatch.Start(); 

// Do something 

// Stop timing 
stopwatch.Stop(); 

// Result 
var elapsedTime = stopwatch.Elapsed; 
1

首先使用System.Diagnostics.Stopwatch記錄您的時間。

我看到有在GetFileListcatch語句後如下:

Console.WriteLine("First retry (GetFileList)"); 
Console.ReadKey(); 
retrier++; 

定時器將繼續在等待用戶輸入運行。是否有可能第一次嘗試失敗,並且需要131秒才能在命令窗口中按下一個鍵?

+0

我刪除了這兩行。實際上,我發佈了一些其他測試。 –