Attualmente sto sostituendo qualche casa al forno funzionalità operazione con una nuova implementazione utilizzando la funzionalità nuove System.Threading.Tasks trovato in .net 4.Come ottenere la notifica che uno System.Threading.Tasks.Task ha completato
Tuttavia, ho un piccolo problema e, anche se posso pensare ad alcune soluzioni, vorrei ricevere qualche consiglio su quale sia in genere il modo migliore per farlo, e se mi manca un trucco da qualche parte.
Quello che mi serve è che un processo arbitrario sia in grado di avviare un'attività, ma poi proseguire e non attendere il termine dell'attività. Non è un problema, ma quando poi ho bisogno di fare qualcosa con il risultato di un compito non sono del tutto sicuro del modo migliore di farlo.
Tutti gli esempi che ho visto utilizzano Wait() sull'attività finché non completa o fa riferimento al parametro Result sull'attività. Entrambi blocceranno la discussione che ha avviato l'attività, che non desidero.
Alcune soluzioni che ho pensato:
Creare un nuovo thread e avviare l'operazione su questo, quindi utilizzare Wait() o .Result per bloccare il nuovo thread e sincronizzare il risultato al chiamante in qualche modo, possibilmente con il polling al parametro IsCompleted delle attività.
Avere un'attività "Notifica completata" che è possibile avviare dopo il completamento dell'attività che si desidera eseguire, quindi genera un evento statico o qualcosa del genere.
Passare un delegato nell'input dell'attività e chiamarlo per notificare che l'attività è terminata.
posso pensare o di pro e contro a tutti loro, ma soprattutto non mi piace l'idea di dover creare esplicitamente un nuovo thread per avviare l'attività quando l'uno degli obiettivi di utilizzo del La classe di attività in primo luogo è quella di astrarre dall'uso diretto del thread.
Qualche idea sul modo migliore? Mi sto perdendo qualcosa di semplice? Un evento "Completato" sarebbe troppo chiedere :)? (Che ci sia una buona ragione per cui non ce n'è uno!)
Per curiosità, perché non utilizzare BackgroundWorker? Ha il completamento del compito, così come la notifica di cancellazione. – Robaticus
'BackgroundWorker' non è più necessario ora che' Task' è con noi. BGW richiedeva un 'SynchronizationContext', che è opzionale con' Task' (abilitando un maggiore parallelismo). –