MSBuild-如何创建“关键部分”

我有一个并行构建的多个项目,每个项目在某个时间点确实调用<Exec />任务。该执行任务正在运行3pty工具,如果该工具的另一个实例正在运行,则该工具将崩溃。是否有一些本机方式如何在msbuild中实现“互斥体”?

(可行的)明显的解决方案是使构建同步-但这会减慢整个构建的速度。

iCMS 回答:MSBuild-如何创建“关键部分”

最后我编写了自己的 msbuild 扩展库,如下所示

msbuild 部分:

<UsingTask TaskName="MutexExec" AssemblyFile="$(CommonTasksAssembly)" />

C# 部分:

// <PackageReference Include="Microsoft.Build.Utilities.Core" Version="16.9.0" />
// <PackageReference Include="Microsoft.Build.Tasks.Core" Version="16.9.0" />
// <PackageReference Include="Microsoft.Build.Framework" Version="16.9.0" />

using System;
using System.Diagnostics;
using System.Threading;
using Microsoft.Build.Framework;
using Microsoft.Build.Tasks;

/// <summary>
/// Like a Exec task,but with critical section
/// </summary>
public class MutexExec : Exec
{
    /// <summary>
    ///     Gets or sets mutex name
    /// </summary>
    [Required]
    public string MutexName { get; set; }

    /// <inheritdoc />
    public override bool Execute()
    {
        var timeout = TimeSpan.FromMinutes(5);
        var stopwatch = Stopwatch.StartNew();
        while (stopwatch.Elapsed < timeout)
        {
            bool createdNew;
            using (var mutex = new Mutex(true,this.MutexName,out createdNew))
            {
                if (createdNew)
                {
                    bool result = base.Execute();
                    try
                    {
                        this.Log.LogMessage(MessageImportance.Normal,"Releasing {0}",this.MutexName);
                        mutex.ReleaseMutex();
                    }
                    catch (Exception e)
                    {
                        this.Log.LogError("Failure releasing {0} - {1}",e);
                    }

                    return result;
                }
            }

            this.Log.LogMessage(MessageImportance.Normal,"Waiting for {0} - ellapsed {1}",stopwatch.Elapsed);
            Thread.Sleep(5000);
            continue;
        }

        this.Log.LogError("Failed to acquire {0} in {1}.",timeout);
        return false;
    }
}
本文链接:https://www.f2er.com/1966448.html

大家都在问