我有一個函數可以獲取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
http://www.jetbrains.com/profiler/使用它來找出:)它會找到耗時的方法 – wudzik
在vstudio中使用探查器 –
我不喜歡使用Environment.Exit(),也是如何你在做測試嗎?運行調試/發佈可執行文件? –