Come si chiama questo modello? Corri finalmente?

2

C'è un nome per questo modello? Ho scritto questo tipo di cose un paio di volte in JavaScript e di recente mi sono ritrovato a scriverlo in C #. Il fatto è che mi aspetto che sia già stato implementato in una libreria da qualche parte in cui non sapevo cosa cercare.

In pseudo codice è qualcosa di simile a questo:

if (null != referenceToPreviousRequest) {
    referenceToPreviousRequest.cancel();
}

referenceToPreviousRequest = setTimeout(function() {
    //The thing I ultimately want to do
}, 1000 /*The delay after the last request*/);

In genere utilizzo questo tipo di codice nel lato client JavaScript, per ritardare una richiesta AJAX fino a un certo periodo di tempo dopo l'ultimo input dell'utente, ad es. la ricerca.

    
posta Ian Newson 24.11.2014 - 19:22
fonte

1 risposta

3

Ciò che descrivi è noto come JavaScript Promises, in termini di programmazione generale sono chiamati Continuazioni . C # li supporta tramite le parole chiave Task Parallel Library e Async / Await.

Ecco come funziona, voglio chiamare un'operazione in modo asincrono. Se l'operazione è già dichiarata Async è semplice:

  • Aggiungi asincrono alla tua funzione che chiama la funzione asincrona esistente
  • Cambia il valore restituito in Attività (per vuoto) o Attività (per qualsiasi altro tipo T)
  • Posiziona la parola chiave attende davanti alla chiamata a quella funzione asincrona. E segui quella chiamata con il resto della logica della mia funzione.

Ecco un esempio (tratto da MSDN Documenti su Async Await ).

// Three things to note in the signature: 
//  - The method has an async modifier.  
//  - The return type is Task or Task<T>. (See "Return Types" section.)
//    Here, it is Task<int> because the return statement returns an integer. 
//  - The method name ends in "Async."

async Task<int> AccessTheWebAsync()
{ 
    // You need to add a reference to System.Net.Http to declare client.
    HttpClient client = new HttpClient();

    // GetStringAsync returns a Task<string>. That means that when you await the 
    // task you'll get a string (urlContents).
    // The await operator suspends AccessTheWebAsync. 
    //  - AccessTheWebAsync can't continue until getStringTask is complete. 
    //  - Meanwhile, control returns to the caller of AccessTheWebAsync. 
    //  - Control resumes here when getStringTask is complete.  
    //  - The await operator then retrieves the string result from getStringTask. 

    string urlContents = await client.GetStringAsync("http://www.microsoft.com");

    // The return statement specifies an integer result. 
    // Any methods that are awaiting AccessTheWebAsync retrieve the length value. 
    return urlContents.Length;
}

La lettura dell'articolo collegato descriverà cosa sta accadendo in background.

Puoi anche eseguire esplicitamente le continue in C # usando l'operazione ContinueWith

    
risposta data 24.11.2014 - 20:17
fonte

Leggi altre domande sui tag