在父进程被杀死后完成异步任务
Having an async task finish after parent process is killed
我正在尝试在 TFSBuild 完成后删除一个目录 (3gb)。我将任务放在 try finally 块中,以便它始终执行。问题是当手动停止构建时,如果花费 >1 分钟左右,任务将被终止。 TFSBuild 认为构建已挂起,因为它需要很长时间才能停止。
我尝试了以下方法但无济于事:
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(s => DeleteDir(@"C:2\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 分钟后终止删除任务。
如何让这个删除任务在父进程被杀死后执行?
诀窍是启动另一个进程来执行删除。 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 "$(Cmd)"" />
</Target>
</Project>
无论 tfsbuild 进程发生什么,该命令都会 运行 完成。
请注意,此 post 中还有一些实现此目的的其他选项:MSBuild exec task without blocking
我正在尝试在 TFSBuild 完成后删除一个目录 (3gb)。我将任务放在 try finally 块中,以便它始终执行。问题是当手动停止构建时,如果花费 >1 分钟左右,任务将被终止。 TFSBuild 认为构建已挂起,因为它需要很长时间才能停止。
我尝试了以下方法但无济于事:
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(s => DeleteDir(@"C:2\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 分钟后终止删除任务。
如何让这个删除任务在父进程被杀死后执行?
诀窍是启动另一个进程来执行删除。 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 "$(Cmd)"" />
</Target>
</Project>
无论 tfsbuild 进程发生什么,该命令都会 运行 完成。
请注意,此 post 中还有一些实现此目的的其他选项:MSBuild exec task without blocking