Condividi tramite


MSDN Tips & Tricks

I consigli degli esperti italiani per sfruttare al meglio gli strumenti di sviluppo e semplificare l’attività quotidiana.

In questa pagina

Metodi anonimi generici Metodi anonimi generici
Schedulare una Team Build automaticamente Schedulare una Team Build automaticamente
Ottimizzare ASP.NET rimuovendo HttpModule inutilizzati Ottimizzare ASP.NET rimuovendo HttpModule inutilizzati
ASP.NET AJAX – Aggiornare un UpdatePanel con un controllo esterno ASP.NET AJAX – Aggiornare un UpdatePanel con un controllo esterno

Metodi anonimi generici

Di Riccardo Golia - Microsoft MVP

I metodi anonimi (anonymous method) sono una novità di C# 2.0. Essi rappresentano un tipo particolare di metodo, che permette di associare a un delegate un blocco di istruzioni in modo diretto tramite una definizione in-line. In generale la firma del metodo anonimo (numerosità e tipo dei parametri e tipo di ritorno) deve combaciare con quando dichiarato nella definizione del delegate a cui il metodo è associato.

using System;

namespace Microsoft.MsdnItaly.Tips
{
    class AnonymousMethodDemo
    {
        // Delegate con un parametro
        delegate void PrintDelegate(string text);
        
        static void Main()
        {
            // Anonymous method
            PrintDelegate print = delegate(string text)
                            {
                                Console.WriteLine(text);
                                Console.ReadLine();
                            };
            
            print("Hello,World!");
        }
    }
}

Un metodo anonimo può essere usato anche con parametri di tipo generico, esattamente come qualunque altro metodo. Dal momento che i delegate possono includere parametri generici nella loro dichiarazione, un metodo anonimo può usare i tipi generici definiti a livello di delegate. In questo caso occorre indicare il tipo da utilizzare nella firma del metodo anonimo in modo tale che corrisponda al tipo specificato per il delegate a cui il metodo stesso è associato.

using System;

namespace Microsoft.MsdnItaly.Tips
{
    class GenericAnonymousMethodDemo
    {
        // Delegate con parametro generico
        delegate void PrintDelegate<T>(T input);
        
        static void Main()
        {
            // Anonymous method generico
            PrintDelegate<int> print = delegate(int input)
                            {
                                Console.WriteLine(input.ToString());
                                Console.ReadLine();
                            };
            
            print(18082005);
        }
    }
}

 

Schedulare una Team Build automaticamente

Di Lorenzo Barbieri - Microsoft MVP

Team Foundation Server è dotato di un servizio di Build centralizzato che può essere gestito manualmente direttamente dal Team Explorer integrato in Visual Studio 2005, come mostrato in Figura 1.

Figura 1

Figura 1

Per creare una Team Build è possibile utilizzare il wizard richiamabile con il comando “New Team Build Type”. Il wizard richiede il nome e la descrizione della Team Build, come mostrato in Figura 2:

Figura 2

Figura 2

Viene poi richiesto di indicare la soluzione da compilare e in che versione compilarla (Figura 3).

Figura 3

Figura 3

Bisogna poi inserire i dati di default riguardanti la macchina di build, la directory di build e soprattutto la drop location, ovvero il percorso di rete (non si può specificare un disco locale, ma solo un path UNC) in cui verranno salvati i risultati delle build (Figura 4).

Figura 4

Figura 4

L’ultimo passo del wizard permette di scegliere se effettuare anche la Code Analysis e i test automatizzati mentre si fa la build (Figura 5). Bisogna prestare attenzione che se si seleziona una di queste opzioni le versioni con le funzionalità corrispondenti di Visual Studio Team System andranno installate sulla macchina di Build (Developer, Tester, Database Professional o Team Suite a seconda delle funzionalità selezionate nei test).

Figura 5

Figura 5

Una volta creata una Team Build è possibile lanciarla manualmente, selezionando “Build Team Project” dal menu di Figura 1.

Verrà mostrata la schermata che chiede di selezionare il nome della Team Build, ed eventualmente di cambiare macchina di build e directory di lavoro. La drop location invece rimarrà quella impostata alla creazione della build (Figura 6).

Figura 6

Figura 6

Pochi sanno però che è possibile richiamare le Team Build anche da riga di comando eseguendo TfsBuild.exe su una macchina dove è installato il Team Explorer.

TfsBuild.exe start TeamFoundationServer TeamProject BuildType [/m:machine] [/d:directory]

Come si vede è necessario specificare il server, il Team Project, la Build da eseguire, e opzionalmente la macchina su cui fare la Build (che deve avere installato il servizio di Team Build) e una cartella locale sulla macchina.

Utilizzando il comando TfsBuild.exe è possibile quindi schedulare Build a orari particolari usando gli Scheduled Task di Windows (Attività Pianificate con Windows in italiano). Conviene inserire il comando TfsBuild all’interno di un file .bat o .cmd, e poi schedularlo all’orario voluto utilizzando il Wizard, e impostando di far girare il task con un utente che ha i permessi di Team Build sul Team Foundation Server e sul Team Project selezionato, come mostrato in Figura 7.

Figura 7

Figura 7

Se si vuole personalizzare ulteriormente la Team Build creata (ad esempio per aggiungere altri passi) bisogna intervenire sui file di definizione della Team Build, che vengono creati sotto Source Control all’interno del Team Project, come mostrato in Figura 8:

Figura 7

Figura 7

Il file principale è il file TFSBuild.proj, che contiene tutti i passi della build in formato MSBuild, il formato XML definito da Visual Studio 2005. Maggiori informazioni su MSBuild possono essere trovate qui.

Per maggiori informazioni sul funzionamento della Team Build e sulla sua personalizzazione possono essere trovate in questo webcast in Italiano: Team Build: andare oltre l'F5.

 

Ottimizzare ASP.NET rimuovendo HttpModule inutilizzati

Di Daniele Bochicchio - Microsoft MVP

ASP.NET utilizza gli HttpModule per intercettare e filtrare gli eventi legati all’applicazione. Sono molto utili perché consentono, tra l’altro, di estendere il funzionamento di ASP.NET, aggiungendo comportamenti personalizzati.

Ci sono però molti più HttpModule attivi di default di quelli che sono effettivamente necessari, per fare in modo che non sia necessario registrarli manualmente quando necessari. Questo moduli sono utili in alcuni scenari, ma quando si deve badare alle performance è ovviamente utile rimuoverli, così che non vengano istanziati e, soprattutto, non rispondano agli eventi legati all’applicazione quando le relative funzionalità sono disattivate.

Quello che segue è uno spezzone di web.config con la rimozione di alcuni tra gli HttpModule meno di frequente utilizzati. Ovviamente non è detto che in tutti i casi vadano rimossi tutti, ma in molti scenari questa modifica consente di guadagnare ulteriormente in performance.

<configuration>
<system.web>
<httpModules>
<remove name="Session"/>
<!-- se non si usa la Session  -->
 <remove name="FileAuthorization"/>
<remove name="WindowsAuthentication"/>
<!-- solo se si usa Forms Authentication  -->
<remove name="FormsAuthentication"/>
<!-- solo se si usa Windows Authentication  -->
     <remove name="PassportAuthentication"/>
<!--praticamente inutilizzato -->
</httpModules>
</system.web>
</configuration>

 

ASP.NET AJAX – Aggiornare un UpdatePanel con un controllo esterno

Di Davide Vernole - Microsoft MVP

Se vogliamo aggiornare un UpdatePanel posto nella nostra pagina da un controllo esterno allo stesso pannello, possiamo sfruttare la collezione dei triggers dell’UpdatePanel affinché il contenuto si aggiorni in base alla richiesta di postback da parte di quel particolare controllo.

Per farlo basterà inserire nell’UpdatePanel, in modo dichiarativo o utilizzando l’editor della proprietà Triggers, un trigger di tipo AsyncPostBackTrigger che dipenda dal controllo che vogliamo che generi l’aggiornamento. Dovremo, inoltre, cambiare la proprietà UpdateMode da Always, valore di default, a Conditional in modo da garantirci che l’aggiornamento venga scatenato solo dal controllo che noi abbiamo indicato nel trigger.

Proviamo a vedere un semplice esempio. Ipotizziamo di avere una pagina che contiene un LinkButton chiamato LinkButtonUpdate e un UpdatePanel denominato UpdatePanelMain. Inseriamo all’interno dell’UpdatePanelMain una label che chiameremo LabelNow.Vogliamo che al premere del LinkButtonUpdate, il contenuto dell’UpdatePanelMain venga aggiornato e in particolare che la LabelNow si aggiorni riportando la data e l’ora dell’ultimo aggiornamento eseguito. La nostra pagina risultante è la seguente:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Triggers.aspx.cs" Inherits="Triggers" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Update Page</title>
</head>
<body>
    <form id="FormMain" runat="server">
    <div>
<asp:ScriptManager ID="ScriptManagerMain" runat="server" />
    </div>
<asp:LinkButton ID="LinkButtonUpdate" runat="server" 
OnClick="LinkButtonUpdate_Click">Aggiorna</asp:LinkButton>
<br /><br />
<asp:UpdatePanel ID="UpdatePanelMain" runat="server" UpdateMode=”Conditional”>
<ContentTemplate>
<asp:Label ID="LabelNow" runat="server"></asp:Label>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="LinkButtonUpdate" />
</Triggers>
</asp:UpdatePanel>
    </form>
</body>
</html>

Per garantirci il risultato voluto abbiamo impostato la proprietà UpdateMode a Conditional e inserito un trigger collegato al LinkButtonUpdate.

Ora, non ci resta che aggiungere un metodo in grado di gestire l’evento Click del LinkButtonUpdate che vada a impostare il valore della LabelNow. Il metodo creato a tale scopo è il seguente:

protected void LinkButtonUpdate_Click(object sender, EventArgs e)
    {
        this.LabelNow.Text = String.Format("Ultimo aggiornamento eseguito {0} alle ore {1}", 
DateTime.Now.ToLongDateString(), DateTime.Now.ToLongTimeString());
    }

Ecco ottenuto un UpdatePanel aggiornabile da un controllo contenuto nella stessa pagina, ma al di fuori del pannello da aggiornare.