C# 等待上一个函数完成
我正在开发一个web安装程序,我目前拥有的一件事是C# 等待上一个函数完成,c#,C#,我正在开发一个web安装程序,我目前拥有的一件事是 void MoveFiles() { lbldlstatus.Text = "Moving Files"; string InstallDirectory = Directory.GetCurrentDirectory() + "/DoxramosRepack-master"; DirectoryInfo d = new DirectoryInfo(InstallDirectory
void MoveFiles()
{
lbldlstatus.Text = "Moving Files";
string InstallDirectory = Directory.GetCurrentDirectory() + "/DoxramosRepack-master";
DirectoryInfo d = new DirectoryInfo(InstallDirectory);
foreach(var file in d.GetFiles("*"))
{
try
{
if (File.Exists(file.Name)) {
File.Delete(file.Name);
}
Directory.Move(file.FullName, file.Name);
Cleanup();
}
catch(Exception e)
{
MessageBox.Show(e.ToString());
lbldlstatus.Text = "Repack Installation Failed";
}
}
}
void Cleanup()
{
lbldlstatus.Text = "Cleaning Up Files";
try
{
if (File.Exists("Repack.zip"))
{
File.Delete("Repack.zip");
}
if(Directory.Exists("DoxramosRepack-master"))
{
Directory.Delete("DoxramosRepack-master");
}
lbldlstatus.Text = "Repack Installed Successfully";
}
当我进入Cleanup()
时,我有一个System.IO.IOException
进程无法访问文件Repack.zip,因为它正被使用
另一个过程
完整的代码运行
下载->提取->移动->清理
我不确定正在使用什么流程,但我正在寻找一种方法,让每个流程在开始之前等待前一个流程完成 根据下面的提取代码
void Extract()
{
string zipPath = @"Repack.zip";
string extractPath = @".";
try
{
using (ZipFile unzip = ZipFile.Read(zipPath))
{
unzip.ExtractAll(extractPath);
lbldlstatus.Text = "Extracting Files";
MoveFiles();
}
}
catch (ZipException e)
{
MessageBox.Show(e.ToString());
lbldlstatus.Text = "Repack Installation Failed";
}
}
在完成zip文件之前,您正在调用移动文件。由于move file方法负责调用clean-up函数,因此在尝试删除zip文件之前,应该确保该zip文件已被处理
void Extract()
{
string zipPath = @"Repack.zip";
string extractPath = @".";
try
{
using (ZipFile unzip = ZipFile.Read(zipPath))
{
unzip.ExtractAll(extractPath);
lbldlstatus.Text = "Extracting Files";
}
MoveFiles();
}
catch (ZipException e)
{
MessageBox.Show(e.ToString());
lbldlstatus.Text = "Repack Installation Failed";
}
}
所有东西搬走后,也应进行清理。当前,示例代码在for循环中重复调用它 根据下面的提取代码
void Extract()
{
string zipPath = @"Repack.zip";
string extractPath = @".";
try
{
using (ZipFile unzip = ZipFile.Read(zipPath))
{
unzip.ExtractAll(extractPath);
lbldlstatus.Text = "Extracting Files";
MoveFiles();
}
}
catch (ZipException e)
{
MessageBox.Show(e.ToString());
lbldlstatus.Text = "Repack Installation Failed";
}
}
在完成zip文件之前,您正在调用移动文件。由于move file方法负责调用clean-up函数,因此在尝试删除zip文件之前,应该确保该zip文件已被处理
void Extract()
{
string zipPath = @"Repack.zip";
string extractPath = @".";
try
{
using (ZipFile unzip = ZipFile.Read(zipPath))
{
unzip.ExtractAll(extractPath);
lbldlstatus.Text = "Extracting Files";
}
MoveFiles();
}
catch (ZipException e)
{
MessageBox.Show(e.ToString());
lbldlstatus.Text = "Repack Installation Failed";
}
}
所有东西搬走后,也应进行清理。当前,示例代码在for循环中重复调用它 您粘贴在pastebin上的代码与您在此处发布的代码不同。pastebin中的代码从不调用清理 不管怎样,问题是因为您正在使用块从
中调用MoveFiles()
:
using (ZipFile unzip = ZipFile.Read(zipPath))
{
unzip.ExtractAll(extractPath);
lbldlstatus.Text = "Extracting Files";
MoveFiles();
}
将其移出使用块 您粘贴在pastebin上的代码与您在此处发布的代码不同。pastebin中的代码从不调用清理
不管怎样,问题是因为您正在使用
块从中调用MoveFiles()
:
using (ZipFile unzip = ZipFile.Read(zipPath))
{
unzip.ExtractAll(extractPath);
lbldlstatus.Text = "Extracting Files";
MoveFiles();
}
将其移出使用块 我认为您在任何地方都没有使用异步方法,因此可能没有正确关闭文件。要提取的代码可能没有正确关闭或处理,因此,当您尝试删除仍在使用的zip文件时。由于提取代码未显示,因此无法确认是否存在这种情况。当我回到我的电脑时,如果没有问题,我将在读入dispose后抛出下载、提取并移动到粘贴箱。谢谢,伙计们,代码本身就是一切。我首先试图弄清楚如何在下载完整帮助程序中使用client.Dispose(),意识到我不能在主函数期间处理它,我感到不知所措。我不认为您在任何地方使用异步方法,因此可能没有正确关闭文件。要提取的代码可能没有正确关闭或处理,因此,当您尝试删除zip文件时,它仍在使用中。由于提取代码未显示,因此无法确认是否存在这种情况。当我回到我的电脑时,如果没有问题,我将在读入dispose后抛出下载、提取并移动到粘贴箱。谢谢,伙计们,代码本身就是一切。我第一次试图弄清楚如何在下载完整帮助程序中使用client.Dispose(),我意识到我不能在主函数中处理它,我不知所措。谢谢,我甚至没有注意到我在使用块中有它。(我之前注意到了foreach,并且已经修复了它,但是也谢谢你指出它)谢谢,我甚至没有注意到我在使用块中有它。(我早些时候注意到了foreach,已经修好了,但也谢谢你指出它)