Descrizione del problema: si scrive una libreria che contiene alcuni algoritmi/attività che possono richiedere molto tempo per terminare, per vari motivi: computazionale, file system, comunicazione di rete ecc Si vuole essere in grado di:.NET: meccanismo per la sincronizzazione di attività di lunga durata
- inviare alcune informazioni di avanzamento sul compito (progresso, attività di registrazione etc.)
- hanno un modo per annullare l'operazione prima del completamento se qualche segnale esterno o proprietà è stata impostato.
Ho implementato un framework per questo, ma ciò richiede che tutte queste attività debbano fare riferimento a un assembly che contiene questo framework.
La mia domanda: esiste un meccanismo già integrato in .NET framework (3.5 o inferiore) per il problema descritto sopra?
So che potrei usare gli eventi, ma questo significherebbe che le attività di lunga durata dovrebbero esporre tali eventi, che penso sia un sovraccarico. Idealmente, voglio avere un framework che nasconda i problemi di multithreading ed è dipendente dall'iniezione di dipendenze, ma non dipenderà da un assembly addizionale personalizzato e non inquinerebbe l'interfaccia originale.
Spero di aver descritto il problema abbastanza bene. In caso contrario, posso pubblicare alcuni esempi di interfacce dal mio framework.
UPDATE: OK, penso che la mia descrizione del problema abbia bisogno di un po 'di chiarimenti :). Quando dico "long-running", non intendo "long" nel senso del flusso di lavoro. Sto lavorando a un'app di mapping WinForms che fa ogni genere di cose, come la generazione di relief contours. Per fare ciò, deve prima scaricare i file di dati di elevazione da un server FTP, decomprimerli e quindi eseguire alcuni calcoli. Ho scritto il codice per questo molto tempo fa, ma al fine di renderlo più GUI-friendly, devo vari controlli retrofit - per esempio, rilevando che l'utente ha cliccato sul tasto Esci e interrompere il processo.
Fondamentalmente la mia preoccupazione è: come scrivere un codice che può essere utilizzato in un secondo momento (se mai) in un ambiente GUI, in cui non è possibile eseguire semplicemente tutto nel thread GUI principale e bloccare l'intera applicazione. La sfida è trovare un modo per rendere il codice adatto agli scopi della GUI senza legarlo a una particolare piattaforma della GUI.
Primi pensieri_ Si può esaminare utilizzando System.Diagnostics.PerformanceCounter per eseguire la registrazione delle attività numeriche. Quindi qualsiasi applicazione che ne conosce il nome può leggere i dati. Per segnalare un annullamento, puoi utilizzare EventWaitHandle con un handle denominato. Entrambi questi approcci non richiedono il collegamento delle DLL, ma richiedono una denominazione "stringa" condivisa. Oppure vai al percorso WWF come suggerisce @mark. –
Voglio evitare che il codice della libreria "pulito e innocente" si mescoli con il gruppo difficile come attesa handle, thread e WMI;) Sto cercando un'astrazione di questi pattern (preferibilmente attraverso le interfacce C#, per renderlo più testabile). –