Condividi tramite


Registrazione in un ambiente a più processori

La possibilità di MSBuild 3.5 di utilizzare più processori può ridurre notevolmente i tempi di compilazione del progetto, ma aggiunge complessità alla registrazione.In un ambiente a processore singolo, il logger è in grado di gestire eventi, messaggi, avvisi ed errori in ingresso in modo prevedibile e sequenziale.In un ambiente multiprocessore, invece, eventi di origini diverse possono verificarsi contemporaneamente o fuori sequenza.MSBuild 3.5 fornisce un nuovo logger compatibile con più processori e consente la creazione di "logger di inoltro" personalizzati.

Registrazione di compilazioni a più processori

Quando si compilano uno o più progetti in un sistema a più processori o multicore, gli eventi di compilazione di MSBuild per tutti i progetti vengono generati contemporaneamente. Al logger può arrivare una grande quantità di dati degli eventi contemporaneamente o fuori sequenza. Questo può comportare un sovraccarico del logger e, di conseguenza, un aumento dei tempi di compilazione, output del logger non corretto o compilazione non funzionante. Per risolvere questi problemi, il logger di MSBuild 3.5 è in grado di elaborare gli eventi fuori sequenza e correlare gli eventi e le relative origini.

È possibile migliorare ulteriormente l'efficienza della registrazione creando un logger di inoltro personalizzato.Un logger di inoltro personalizzato agisce come un filtro consentendo di scegliere, prima della compilazione, gli eventi che si desidera controllare.Quando si utilizza un logger di inoltro personalizzato, gli eventi indesiderati non possono sovraccaricare il logger, ingombrare i log, o rallentare i tempi di compilazione.

Bb383987.collapse_all(it-it,VS.110).gifModello di registrazione centrale

Per le compilazioni a più processori, MSBuild utilizza un "modello di registrazione centrale". Nel modello di registrazione centrale, un'istanza di MSBuild.exe agisce come processo di compilazione primario, o "nodo centrale". Le istanze secondarie di MSBuild.exe, o "nodi secondari", sono associate al nodo centrale.I logger basati su ILogger e associati al nodo centrale sono noti come "logger centrali" e i logger associati ai nodi secondari sono noti come "logger secondari".

Quando si verifica una compilazione, i logger secondari indirizzano il traffico eventi ai logger centrali.Poiché gli eventi originano molti nodi secondari, i dati arrivano simultaneamente al nodo centrale ma con interfoliazione.Per risolvere i riferimenti tra evento e progetti e tra evento e destinazione, gli argomenti dell'evento includono informazioni di contesto aggiuntive sugli eventi di compilazione.

Anche se è richiesta l'implementazione solo di ILogger da parte del logger centrale, è consigliabile implementare anche INodeLogger in modo che il logger centrale venga inizializzato con il numero di nodi parte della compilazione.L'overload seguente del metodo Initialize viene richiamato quando il motore inizializza il logger.

public interface INodeLogger: ILogger
{
    public void Initialize(IEventSource eventSource, int nodeCount);
}

Bb383987.collapse_all(it-it,VS.110).gifModello di registrazione distribuito

Nel modello di registrazione centrale, il traffico in eccesso dei messaggi in ingresso può sovraccaricare il nodo centrale, ad esempio, in caso di compilazione di più progetti contemporaneamente. Il sistema può risultare sovraccarico e le prestazioni di compilazione ridotte.

Per ridurre il problema, MSBuild offre anche un "modello di registrazione distribuito" che estende il modello di registrazione centrale consentendo di creare logger di inoltro.Un logger di inoltro viene associato a un nodo secondario e riceve eventi di compilazione in ingresso da tale nodo.Il logger di inoltro è simile a un logger normale salvo che può filtrare gli eventi e quindi inoltrare al nodo centrale solo quelli desiderati.Il traffico di messaggi al nodo centrale risulta ridotto e pertanto le prestazioni sono migliori.

È possibile creare un logger di inoltro implementando l'interfaccia IForwardingLogger che deriva da ILogger.L'interfaccia viene definita come segue:

public interface IForwardingLogger: INodeLogger
{
    public IEventRedirector EventRedirector { get; set; }
    public int NodeId { get; set; }
}

Per inoltrare gli eventi in un logger di inoltro, chiamare il metodo ForwardEvent dell'interfaccia IEventRedirector.Come parametro, passare l'oggetto BuildEventArgs appropriato, o un derivato.

Per ulteriori informazioni, vedere Creazione di logger di inoltro.

Bb383987.collapse_all(it-it,VS.110).gifAssociazione di un logger distribuito

Per associare un logger distribuito su una compilazione da riga di comando, utilizzare l'opzione /distributedlogger (o /dl in breve).Il formato per la specifica dei nomi dei tipi di logger e delle classi è lo stesso di quello per l'opzione /logger, ma un logger distribuito presenta due classi di registrazione: un logger di inoltro e un logger centrale.Di seguito è riportato un esempio di associazione di un logger distribuito:

C:\ WINDOWS\Microsoft.NET\Framework\v3.5.20301>msbuild.exe *.proj 
/distributedlogger:XMLCentralLogger,MyLogger,Version=1.0.2,
Culture=neutral*XMLForwardingLogger,MyLogger,Version=1.0.2,
Culture=neutral

I due nomi dei logger nell'opzione /dl sono separati da un asterisco (*).

Vedere anche

Concetti

Logger di compilazione

Creazione di logger di inoltro