Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 等待上一个函数完成_C# - Fatal编程技术网

C# 等待上一个函数完成

C# 等待上一个函数完成,c#,C#,我正在开发一个web安装程序,我目前拥有的一件事是 void MoveFiles() { lbldlstatus.Text = "Moving Files"; string InstallDirectory = Directory.GetCurrentDirectory() + "/DoxramosRepack-master"; DirectoryInfo d = new DirectoryInfo(InstallDirectory

我正在开发一个web安装程序,我目前拥有的一件事是

    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,已经修好了,但也谢谢你指出它)