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
Effettuare lo stream della risposta in ASP.NET Core tramite IAsyncEnumerable
Utilizzare Model as a Service su Microsoft Azure
Creazione di plugin per Tailwind CSS: espandere le funzionalità del framework dinamicamente
Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary
Supporto ai tipi DateOnly e TimeOnly in Entity Framework Core
Usare un KeyedService di default in ASP.NET Core 8
Reactive form tipizzati con modellazione del FormBuilder in Angular
Reactive form tipizzati con FormBuilder in Angular
Installare le Web App site extension tramite una pipeline di Azure DevOps
Aggiungere interattività lato server in Blazor 8
Visualizzare le change sul plan di Terraform tramite le GitHub Actions
Esportare ed analizzare le issue di GitHub con la CLI e GraphQL
I più letti di oggi
- Gli oggetti CallOut di Expression Blend 4.0
- Configurazione tramite environment variable in ASP.NET Core
- Controllare gli accessi IP alle app con Azure Container Apps
- Creare applicazioni web native con Electron
- Utilizzare le sequence di SQL Server in Entity Framework Core
- Update NoDo di marzo 2011 di Windows Phone in fase di distribuzione
- Tile, notifiche e background task in Windows Phone 8
- Mantenere l'ordine dei dati in una query PLINQ