【发布时间】:2016-08-19 23:09:42
【问题描述】:
我正在为我的游戏制作补丁程序。修补程序检查 ftp 服务器上每个文件的大小与用户计算机上的本地文件的大小,如果不同,则从 ftp 服务器下载新文件。
我想添加一条显示“更新完成!X 个文件已更新”的打印消息。当它检查了所有文件但我知道该功能何时结束?
private void CheckForUpdates(string ftpPath, string localPath)
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpPath);
request.Credentials = new NetworkCredential(ftpUser, ftpPass);
request.Method = WebRequestMethods.Ftp.ListDirectory;
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
List<string> files = new List<string>();
string line = reader.ReadLine();
while (!string.IsNullOrEmpty(line))
{
if (line != "." && line != ".." && line != ".htaccess")
{
files.Add(line);
}
line = reader.ReadLine();
}
response.Close();
responseStream.Close();
reader.Close();
foreach (string file in files)
{
string newFtpPath = ftpPath + "/" + file;
string newLocalPath = localPath + "/" + file;
new Thread(() => AppendText("Checking " + newLocalPath + Environment.NewLine)).Start();
if (IsFile(newFtpPath))
{
if (File.Exists(newLocalPath))
{
if (!IsFileEqual(newFtpPath, newLocalPath))
{
new Thread(() => AppendText(file + " is out of date or corrupted. Patching in progress..." + Environment.NewLine)).Start();
new Thread(() => Download(newFtpPath, newLocalPath)).Start();
}
}
else
{
new Thread(() => AppendText(file + " is missing. Patching in progress..." + Environment.NewLine)).Start();
new Thread(() => Download(newFtpPath, newLocalPath)).Start();
}
}
else
{
if (!Directory.Exists(newLocalPath))
{
new Thread(() => AppendText(file + " is missing. Patching in progress..." + Environment.NewLine)).Start();
Directory.CreateDirectory(newLocalPath);
}
new Thread(() => CheckForUpdates(newFtpPath, newLocalPath)).Start();
}
}
}
【问题讨论】:
-
第一次调用该方法后你就知道了。所以在第一次调用递归函数之后的下一行执行。我通常会放入静态计数器以确保我不会无限期地递归开始(当我测试时)
-
我看到你的问题是你正在产生新的线程。我肯定会跟踪您正在创建多少线程并使用信号量之类的东西来控制它
-
想了想。我不一定会在线程中使用递归,它相当复杂,附带各种问题。我只会使用标志和一个while循环来安排再次检查更新的需要。或者重新考虑需求
-
也许使用 Thread.Join 来确保在您进入下一次检查更新时所有事情都已完成
-
旁注:其中一些线程似乎是不必要的。例如,AppendText 操作真的足够长来证明它自己的线程是正确的吗? (对我来说似乎有点矫枉过正)。例如,它是否可以与下载操作结合使用,或者只是同步运行?