E '"sbagliato" / design sbagliato mettere un thread / background worker in una classe?

15

Ho una classe che leggerà da Excel (C # e .Net 4) e in quella classe ho un lavoratore in background che caricherà i dati da Excel mentre l'interfaccia utente può rimanere reattiva. La mia domanda è la seguente: è una cattiva progettazione avere un lavoratore in background in una classe? Devo creare la mia lezione senza di essa e utilizzare un background worker per operare su quella classe? Non riesco a vedere nessun problema per creare la mia classe in questo modo, ma poi sono di nuovo un principiante, quindi ho pensato che mi sarei assicurato prima di continuare.

Spero che questa domanda sia pertinente qui perché non penso che dovrebbe essere su stackoverflow come funziona il mio codice, questo è solo un problema di design.

    
posta Jetti 03.02.2011 - 23:27
fonte

4 risposte

20

Should I create my class without it and use a background worker to operate on that class?

Sì, dovresti. E ti dirò perché - stai violando il principio di singola responsabilità . Accoppiando strettamente la classe che accede al documento excel con come accede al documento excel, si elimina la possibilità per il codice "controller" (qualsiasi codice che lo utilizza) di farlo in un modo diverso. Quanto diverso, puoi chiedere? Cosa succede se il codice del controller ha due operazioni che impiegano molto tempo ma vogliono che siano sequenziali? Se si consente al controller di gestire il threading, è possibile eseguire insieme attività a esecuzione prolungata in un thread. Cosa succede se si desidera accedere al documento excel da un contesto non-UI e non è necessario che venga eseguito il thread?

Spostando la responsabilità di eseguire il threading verso il chiamante, si consente una maggiore flessibilità del codice, rendendolo più riutilizzabile.

    
risposta data 03.02.2011 - 23:47
fonte
3

È buona norma che le operazioni dell'interfaccia utente operino in un thread separato dalle attività in background. Altrimenti l'interfaccia utente non risponde quando l'applicazione è occupata.

Se puoi separare la parte che funziona nel thread in background nella sua classe, il codice sarà più pulito.

    
risposta data 03.02.2011 - 23:34
fonte
0

Vorrei separare l'interfaccia utente dall'attività in background utilizzando classi separate. Ciò incoraggia la separazione delle preoccupazioni. Il codice dell'interfaccia utente e la logica aziendale non vanno mischiati.

    
risposta data 03.02.2011 - 23:44
fonte
0

Da quello che ricordo su BackgroundWorkers è che forniscono un numero di metodi di convenienza come la possibilità di inviare aggiornamenti di avanzamento all'interfaccia utente. Non c'è una regola che dice che non puoi usarlo da una classe diversa però.

Inoltre, se stai eseguendo l'iterazione che non richiede l'elaborazione di elementi in un ordine specifico, considera l'utilizzo di ThreadPool invece (o se sei su .NET 4 usa Task Parallel Library ).

    
risposta data 03.02.2011 - 23:59
fonte

Leggi altre domande sui tag