Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di Kahm
    Registrato dal
    Dec 2004
    residenza
    Rome
    Messaggi
    3,584

    chiamare methodo async da servizio

    salve a tuti

    stavo leggendo questa pagina http://chanmingman.wordpress.com/201...ervice-call-c/

    e mi stavo dilettando a creare e richiamare servizi web
    attualmente uso visual studio 2010, e sto notando che per ogni metodo nel servizio, dal client, ne vedo un'altro con il suffisso "Async"

    immagino che il secondo che crea lui in automatico sia per la chiamata asincrona vero?
    come posso richiamarlo?
    dall'articolo non trovo un nomeMetodo che finisce per END in modo da chiudere la chiamata

    come lo richiamo?
    facendo ricerche nel web mi ritrovo solo esempi che chiamano web service che chiamano lo start ed end, io ne ho solo uno creato da lui
    NN vi diro mai chi sono in realta,
    tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me

  2. #2
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    sicuramente il motivo è che stai usando il framework .net 4.5
    se è cosi questo comporta l'utilizzo della nuova sintassi che ti consente di chiamare il metodo asincrono con una sintassi simile a quella sincrona.
    vedi se funziona:

    codice:
    var risultato= await tuoOggetto.TuoMetodoAsync(parametri);

  3. #3
    Utente di HTML.it L'avatar di Kahm
    Registrato dal
    Dec 2004
    residenza
    Rome
    Messaggi
    3,584
    Originariamente inviato da rsdpzed
    sicuramente il motivo è che stai usando il framework .net 4.5
    se è cosi questo comporta l'utilizzo della nuova sintassi che ti consente di chiamare il metodo asincrono con una sintassi simile a quella sincrona.
    vedi se funziona:

    codice:
    var risultato= await tuoOggetto.TuoMetodoAsync(parametri);
    si e come faccio a sapere quando è finito?

    scusa..ma await cosa è?
    NN vi diro mai chi sono in realta,
    tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me

  4. #4
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    Potevi almeno confermare se stai compilando con .net 4.5
    poi potevi dirmi se la sintassi che ti ho indicato funziona o meno, se ti ha indirizzato verso una soluzione o se ci sono altri problemi e nel caso quali.

    La domanda che poni non puo trovare una risposta esauriente. Non è una classe nuova ma una sintassi nuova, alle spalle c'è tutto il vecchio modello di programmazione asincrona più tutto quello che ha introdotto la classe Task del .net 4.0. Troppe cose.

    comunque ormai ci siamo, pur non sapendo se è il tuo caso, puo essere utile se non altro al forum:

    Il webservice è un asmx hello world predefinito su cui ho aggiunto un attesa di 5 secondi.

    Metodo sincrono
    codice:
    protected void Button1_Click(object sender, EventArgs e)
            {
                DateTime inizio = DateTime.Now;
    
                ServiceReference1.WebService1SoapClient ws = new ServiceReference1.WebService1SoapClient();
                var r = ws.HelloWorld();
    
                PlaceHolder2.Controls.Add(
                    new Label { Text = " Risultato Sincrono: " + r + "
    " });
                PlaceHolder2.Controls.Add(
                    new Label { Text = "Tempo: " + (DateTime.Now - inizio).Seconds + "
    " });
            }
    Nulla di nuovo. Chiami la funzione che ci mette 5 secondi prima di dare il risultato che stampi a video.

    Metodo asincrono
    codice:
    protected async void Button2_Click(object sender, EventArgs e)
            {
                DateTime inizio = DateTime.Now;
    
                ServiceReference1.WebService1SoapClient ws = new ServiceReference1.WebService1SoapClient();
                var r = await ws.HelloWorldAsync();
    
                PlaceHolder2.Controls.Add(
                    new Label { Text = "Risultato asincrono: " + r.Body.HelloWorldResult + "
    " });
                PlaceHolder2.Controls.Add(
                    new Label { Text = "Tempo: " + (DateTime.Now - inizio).Seconds + "
    " });
            }
    Questa sintassi usa le nuove parole chiave async e await. Il metodo deve essere contrassegnato come async. Effettui la chiamata al servizio asincrono che normalmente ritornerebbe un oggetto di sincronizzazione, grazie ad await però effettuo il pooling aspettando il direttamente risultato sottoforma di oggetto HelloWorldResponse. La classe HelloWorldResponse viene creata da visualstudio quando importo il servizio.
    Per poter usare questa sintassi è necessario che la pagina aspx contenga la direttiva Async="True".

    Questo sistema non porta grossi benefici rispetto alla chiamata sincrona perché viene effettuato il pooling subito dopo la chiamata asincrona, lo si puo vedere dalla label che segna il tempo. La programmazione asincrona mostra tutti i suoi benefici se tra la chiamata asincrona e il pooling vengono effettuate altre computazioni meglio ancora se asincrone anche loro!
    ecco un esempio
    codice:
    protected async void Button3_Click(object sender, EventArgs e)
            {
                DateTime inizio = DateTime.Now;
    
                ServiceReference1.WebService1SoapClient ws = new ServiceReference1.WebService1SoapClient();
                
                var r1 = ws.HelloWorldAsync();
                var r2 = ws.HelloWorldAsync();
                var r3 = ws.HelloWorldAsync();
    
                await Task.WhenAll(r1, r2, r3);
    
                PlaceHolder2.Controls.Add(
                    new Label { Text = "Risultato asincrono:
    " + r1.Result.Body.HelloWorldResult + "
    " });
                PlaceHolder2.Controls.Add(
                    new Label { Text = r2.Result.Body.HelloWorldResult + "
    " });
                PlaceHolder2.Controls.Add(
                    new Label { Text = r3.Result.Body.HelloWorldResult + "
    " });
                PlaceHolder2.Controls.Add(
                    new Label { Text = "Tempo: " + (DateTime.Now - inizio).Seconds + "
    " });
            }
    Qui vengono lanciati tre task asincroni che verranno eseguiti in parallelo. Il pooling viene effettuato alla fine poco prima del momento in cui servono i risultati. Il lavoro che normalmente avrebbe impiegato 15 secondi viene svolto in 5 secondi.
    I metodi asincroni restituiscono l'oggetto di sincronizzazione che vengono passati al metodo WhenAll della classe task. Anche qui la parola chiave await rende la chiamata a WhenAll più pulita rispetto a come sarebbe stato prima di .net 4.5.

  5. #5
    Utente di HTML.it L'avatar di Kahm
    Registrato dal
    Dec 2004
    residenza
    Rome
    Messaggi
    3,584
    grazie
    sei stato molto chiaro

    io uso il framework 4 ecco perchè non vedevo le 2 funzioni

    infatti il web service funziona con un 4.5
    ed io lo stavo richiamando dal mio pc in locale
    NN vi diro mai chi sono in realta,
    tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me

  6. #6
    Utente di HTML.it L'avatar di cassano
    Registrato dal
    Aug 2004
    Messaggi
    3,002
    Scusate ma questo comando non è sincrono ??

    codice:
    var r1 = ws.HelloWorldAsync();
                var r2 = ws.HelloWorldAsync();
                var r3 = ws.HelloWorldAsync();

  7. #7
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    non mi sembra

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.