Domanda

Ho creato un webservice e quando voglio usare i suoi metodi lo istanziamo nella procedura a, chiamo il metodo, e alla fine lo dispongo, comunque penso che potrebbe anche andare bene istanziare il webservice nel "private void" Evento Main_Load(mittente oggetto, EventArgs e)".

Il fatto è che se lo faccio nel primo modo devo istanziare il servizio web ogni volta che ho bisogno di uno dei suoi metodi, ma nell'altro modo devo mantenere un servizio web sempre connesso quando lo uso in un modulo, ad esempio.

Vorrei sapere quale di queste pratiche è migliore o se esiste un modo molto migliore per farlo

Strategia 1

private void btnRead_Click(object sender, EventArgs e)
{
    try
    {
        //Show clock
        this.picResult.Image = new Bitmap(pathWait);

        Application.DoEvents();

        //Connect to webservice
        svc = new ForPocketPC.ServiceForPocketPC();
        svc.Credentials = new System.Net.NetworkCredential(Settings.UserName, Settings.Password);
        svc.AllowAutoRedirect = false;
        svc.UserAgent = Settings.UserAgent;
        svc.PreAuthenticate = true;
        svc.Url = Settings.Url;
        svc.Timeout = System.Threading.Timeout.Infinite;

        svc.CallMethod();
         ...
    }
    catch (Exception ex)
    {
        ShowError(ex);
    }
    finally
    {
        if (svc != null)
            svc.Dispose();
    }
}

Strategia 2

private myWebservice svc;

private void Main_Load(object sender, EventArgs e)
{
    //Connect to webservice
    svc = new ForPocketPC.ServiceForPocketPC();
    svc.Credentials = new System.Net.NetworkCredential(Settings.UserName, Settings.Password);
    svc.AllowAutoRedirect = false;
    svc.UserAgent = Settings.UserAgent;
    svc.PreAuthenticate = true;
    svc.Url = Settings.Url;
    svc.Timeout = System.Threading.Timeout.Infinite;
}

private void btnRead_Click(object sender, EventArgs e)
{
    try
    {
        //Show clock
        this.picResult.Image = new Bitmap(pathWait);

        Application.DoEvents();
        svc.CallMethod();
         ...
    }
    catch (Exception ex)
    {
        ShowError(ex);
    }
}

private void Main_Closing(object sender, CancelEventArgs e)
{
    svc.Dispose();
}
È stato utile?

Soluzione

Dipende dalla frequenza con cui chiamerai il servizio web.Se lo chiamerai quasi costantemente, probabilmente sarebbe meglio usare il metodo n. 2.Tuttavia, se non verrà chiamato così spesso, è meglio utilizzare il metodo n. 1 e istanziarlo solo quando ne hai bisogno.

Altri suggerimenti

In questo momento ho realizzato una soluzione per un dispositivo mobile e risulta essere utilizzata in tempi irregolari, potrebbe essere utilizzata in 10 minuti, 1 ora, 4 ore è molto variabile, sembra che l'approccio migliore sia la prima strategia.

L'anno scorso abbiamo intrapreso un progetto in cui utilizzavamo i servizi web, il fatto è che abbiamo istanziato i nostri servizi web nella procedura Sub New() e lo ha eseguito molto bene, tuttavia, a volte alcuni utenti ci hanno affermato di essersi svegliati dalla sedia e quando sono tornati e hanno provato a continuare con l'applicazione, hanno ricevuto un messaggio di errore di timeout e hanno dovuto effettuare nuovamente l'accesso.

Abbiamo pensato che forse andava bene perché forse gli utenti sono rimasti per molto tempo fuori dai loro posti, ma una volta in una presentazione dell'applicazione con gli amministratori delegati si è verificata esattamente la stessa situazione e personalmente non mi è piaciuto quel comportamento e ecco perché la domanda.

Grazie per la risposta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top