2014-10-29 8 views
5

Jeśli chcę, aby okresowo sprawdzać, czy istnieje żądanie anulowania, chciałbym użyć następującego kodu poniżej stale w moim DoWork obsługi zdarzenia:Czy istnieje czysty sposób sprawdzania żądania anulowania w BackgroundWorker bez ponownego wpisywania tego samego kodu w kółko?

if(w.CancellationPending == true) 
    { 
     e.Cancel = true; 
     return; 
    } 

Czy istnieje czysty sposób na sprawdzenie żądania rezygnacji na BackgroundWorker w C# bez ponownego wpisywania tego samego kodu w kółko?

Proszę odnieść się do poniższego kodu poniżej:

void worker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    ... 

    BackgroundWorker w = sender as BackgroundWorker; 

    if(w.CancellationPending == true) 
    { 
     e.Cancel = true; 
     return; 
    } 

    some_time_consuming_task... 

    if(w.CancellationPending == true) 
    { 
     e.Cancel = true; 
     return; 
    } 

    another_time_consuming_task... 

    if(w.CancellationPending == true) 
    { 
     e.Cancel = true; 
     return; 
    } 

    ... 
} 
+4

Być może dokonać pracownik maszyna stan wtedy można po prostu zrobić 'while (w.CancellationPending!) {Switch (_someSwitch) ...} ' – MickyD

+6

Podziel metodę na delegatów. Powiedzmy "Akcja []", następnie przejdźmy do 'Akcje' wewnątrz pętli sprawdź' if (w.CancellationPending) {e.Cancel = true; return;} ' –

+3

Dla jednego wyodrębnij to do metody pomocnika. – usr

Odpowiedz

5

użyć pętli while i delegatów

Dodaj swoje zadanie na liście delegatów następnie przetestować swoją kondycję w pętli.

Można użyć niestandardowego działania delegata ułatwić to zadanie (patrz: http://msdn.microsoft.com/en-us/library/system.action(v=vs.110).aspx)

void worker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    List<Action> delegates = new List<Action>(); 
    delegates.add(some_time_consuming_task); 
    delegates.add(another_time_consuming_task); 

    BackgroundWorker w = sender as BackgroundWorker;  
    while(!w.CancellationPending && delegate.Count!=0) 
    { 
     delegates[0](); 
     delegates.remove(0); 
    } 

    if(w.CancellationPending) 
     e.Cancel = true; 
} 
Powiązane problemy