I Task sono oggetti che rappresentano un'operazione che può avere uno stato di successo e di fallimento, e tramite il pattern async/await ci permettono facilmente di scrivere codice asincrono. Normalmente, poiché utilizziamo funzioni asincrone del .NET Framework o di WinRT, il nostro codice sfrutta le parole chiavi async/await per attendere e per restituire un nuovo Task che ne ingloba degli altri, ma non sempre questo è possibile.
Supponiamo, per esempio, di avere una Popup per mostrare delle informazioni all'utente, dandogli la possibilità con dei pulsanti di rispondere positivamente o negativamente. Il codice per realizzare questo in WinRT, e in maniera molto simile anche in WPF, è il seguente:
// Creo l'user control con l'interfaccia var uc = new MyUserControl(); uc.yesButton.Click += (s, e) => { // TODO }; // Mostro la popup Popup popup = new Popup(); popup.Child = uc; popup.IsOpen = true;
Per rendere più facile la programmazione, vogliamo a questo punto utilizzare i Task per mostrare la Popup e attendere il relativo responso. Inglobiamo quindi il codice precedente in una funzione che crea la Popup e restituisce un Task.
public static Task<bool> AskAsync() { // ... codice precedente ... var source = new TaskCompletionSource<bool>(); return source.Task; }
Per farlo utilizziamo l'oggetto TaskCompletionSource che ci permette di avere l'oggetto Task e di controllarlo. I relativi metodi TrySetResult e TrySetCanceled ci permettono di completare il Task con successo o meno, permettendo di leggere il risultato e di proseguire per chi sta aspettando l'esito. Nello snippet seguente impostiamo il risultato alla pressione del pulsante sì.
uc.yesButton.Click += (s, e) => { source.TrySetResult(true); };
A questo punto per mostrare la Popup non dobbiamo far altro che invocare la nostra funzione asincrona.
bool r = await Helper.AskAsync(); if (r) { // Risposta positiva }
Eventualmente, possiamo indicare un'eccezione mediante il metodo TrySetException.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Ottimizzare le performance usando Span<T> e il metodo Split
Utilizzare Copilot con Azure Cosmos DB
Generare velocemente pagine CRUD in Blazor con QuickGrid
Utilizzare Hybrid Cache in .NET 9
Rinnovare il token di una GitHub App durante l'esecuzione di un workflow
Recuperare le subissue e il loro stato di completamento in GitHub
Effettuare il log delle chiamate a function di GPT in ASP.NET Web API
Usare i servizi di Azure OpenAI e ChatGPT in ASP.NET Core con Semantic Kernel
Eseguire una ricerca avanzata per recuperare le issue di GitHub
Creare una libreria CSS universale: i bottoni
Utilizzare EF.Constant per evitare la parametrizzazione di query SQL
Recuperare l'ultima versione di una release di GitHub
I più letti di oggi
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- .NET Conference Italia 2024 - Milano
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Utilizzare il pattern matching per semplificare le espressioni