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

本文关键字:终止 进程 异步 任务 | 更新日期: 2023-09-27 18:09:02

我试图在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

我也试过目录。删除等。

TFSBuild执行任务,然后停止构建,但是删除任务没有完成。如果我不叫它async,那么它只会在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