Domanda

Sto cercando di utilizzare uno dei modi indicati di trattare con le operazioni di lunga esecuzione.

I non sarà entrare nei dettagli ciò che può essere realizzato utilizzando ciascuno di questi, ma preferisco spiegare ciò che voglio fare.

Ho un insieme di metodi HTTP-correlati, ogni recupero di alcuni pezzi di informazioni. Tutto questo è parte del più grande all'interno del sistema di un servizio a lungo in esecuzione (quindi non è un po 'fare-una volta, e getta il codice).

In generale, quale approccio è migliore, l'incapsulamento e la manutenibilità saggia: la gestione dei dati restituiti quando è pronto usando Begin / meccanismo Fine / AsyncCallback, o sparando eventi dall'interno le attività, come OnXXXReceived, OnXXXError, utilizzando le classi EventArgs derivate per ogni evento?

Spero mi veniva abbastanza chiaro .. ho deciso di non esempi di codice di alimentazione, dal momento che io sono più interessato a opinioni, consigli e possibili insidie, che in bocconcini di specifica implementazione.

Grazie!

È stato utile?

Soluzione

In generale, i compiti TPL sono molto più facili da utilizzare. Nel tuo caso, creano utilizzando un'opzione di fabbrica e LongRunning.

io non sono così sicuro circa gli eventi però. Perché non elaborare la richiesta / Rresponse in un ciclo o qualcosa di simile? È già in corso una discussione.

Altri suggerimenti

Si potrebbe anche usare ContinuationTasks per elaborare i dati una volta il completamento del compito recupero.

    Task<StockDataCollection> loadFedHistoricalData =
        Task<StockDataCollection>.Factory.StartNew(
            () => LoadFedHistoricalData(),
            TaskCreationOptions.LongRunning);

    Task<StockDataCollection> normalizeHistoricalData =
        loadFedHistoricalData.ContinueWith(
            (t) => NormalizeData(t.Result));

In questo codice viene eseguito il compito loadFedHistoricalData LoadFedHistoricalData che è un compito lungo in esecuzione di I / O bound. Quando questa rendimenti prosegue con un altro compito che normalizza i dati.

ContinueWith prende un TaskContinuationOptions parametro che può essere usi per specificare se il compito prosecuzione corre sempre o solo se una condizione come l'errore o un annullamento è soddisfatta.

Il capitolo 5 A-Dash esempio mostra questo tipo di approccio alternativo alla gestione degli eventi. È possibile scaricare il codice da http://parallelpatterns.codeplex.com/ . Guarda le classi AnalysisEngine e MainWindowViewModel.

È semplicemente non può battere il modello di programmazione asincrona (APM) quando si tratta di prestazioni di I / O. In qualsiasi momento è possibile utilizzarlo, si dovrebbe essere. Per fortuna la Task Parallel Library (TPL) viene fornito con cotto nel supporto per conciliare il lavoro APM nel mix con compiti di "puri" TPL tramite la FromAsync metodo factory .

Controlla questa sezione del SDK .NET su MSDN intitolato TPL e tradizionale NET Asynchronous programmazione per ulteriori informazioni su come combinare questi due modelli di programmazione per raggiungere il nirvana asincrona.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top