在父进程被终止后完成异步任务

时间:2015-08-20 06:43:22

标签: c# asynchronous msbuild tfsbuild delete-file

我正在尝试在TFSBuild完成后删除目录(3gb)。我把任务放在try finally块中,以便它总是执行。问题是当手动停止构建时,如果大约需要1分钟左右,任务就会被终止。 TFSBuild认为构建是挂起的,因为它需要很长时间才能停止。

我尝试过以下无效:

    static void Main(string[] args)
    {
        ThreadPool.QueueUserWorkItem(s => DeleteDir(@"C:\292\Sources\", @"C:\testdel\del.bat"));
    }

    static void DeleteDir(string path, string batchDir)
    {
        var process = new Process
        {
            StartInfo =
            {
                Arguments = string.Format("{0}",
                                          path)
            }
        };

        process.StartInfo.FileName = batchDir;
        process.Start();
    }
}

以下是批处理文件的内容:

del %1 /f /s /Q

我也尝试使用Directory.Delete等。

TFSBuild执行任务然后停止构建,但删除任务未完成。如果我不称它为异步,那么它只会在~1分钟后杀死删除任务。

如何在父进程被终止后执行此删除任务?

1 个答案:

答案 0 :(得分:1)

诀窍是启动另一个进程来执行删除。 Powershell是我这样做的伙伴。

我有一个名为Spawn-Cmd.ps1的实用程序脚本,它为我创建一个批处理文件并将其解锁。请注意,它也可以启动exe或其他PowerShell进程,但我使用批处理文件。

param([string]$cmdToSpawn)

$temp = [IO.Path]::GetTempFileName() + '.cmd'

Out-File -FilePath $temp -InputObject $cmdToSpawn -Encoding ASCII

Start-Process -FilePath $temp -WindowStyle Hidden

接下来修改您的tfs构建脚本以调用脚本。这是一个示例msbuild文件。

<?xml version="1.0" encoding="utf-8"?>
<Project  DefaultTargets="SpawnDelete" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">

    <Target Name="SpawnDelete">
        <PropertyGroup>
            <Cmd>rd /s /q \"z:\path\to\folder\"</Cmd>
        </PropertyGroup>

        <Exec Command="powershell -file Spawn-Cmd.ps1 &quot;$(Cmd)&quot;" />
    </Target>
</Project>

无论tfsbuild进程发生什么,该命令都将运行完毕。

请注意,此帖子中有其他一些实现此目的的选项:MSBuild exec task without blocking