2011-07-15 9 views
5

Studiuję Zadania w .net 4.0 i ich anulowanie. Podoba mi się fakt, że TPL stara się rozwiązać problem anulowania w sposób kooperatywny.Jaki byłby dobry sposób anulowania długich operacji IO/Network przy użyciu Tasks?

Co jednak należy zrobić w sytuacji, gdy połączenie wewnątrz zadania jest blokowane i trwa długo? Dla przykładu IO/Network.

Oczywiście anulowanie zapisów byłoby niebezpieczne. Ale to są przykłady.

Przykład: Jak mogę to anulować? DownloadFile może zająć dużo czasu.

Task.Factory.StartNew(() => 
    WebClient client = new WebClient(); 
    client.DownloadFile(url, localPath); 
); 
+0

Czy możesz przesłać fragment kodu dotyczący swojej sytuacji? –

Odpowiedz

1

Zadanie obsługuje tokeny anulowania. Można utworzyć instancję obiektu CancellationTokenSource i przekazać jej właściwość Token do metody DownloadFile. Następnie w punktach kodu, w których można zatrzymać, sprawdź tokeny, właściwość IsCancellationRequested, aby sprawdzić, czy żądanie anulowania było wymagane.

Należy również przekazać token do StartNew (po metodzie).

Aby faktycznie anulować operację, możesz wywołać metodę Anuluj na tokenie anulowania.

Zapoznaj się z this MSDN article on cancellation

+1

Przykro mi, ale cały mój punkt widzenia dotyczył operacji, nad którymi nie mam kontroli. DownloadFile nie jest moją metodą. – Kugel

+0

Możesz to zrobić tylko wtedy, gdy istnieje wersja asynchroniczna wspierająca anulowanie (w przypadku pliku DownloadFile istnieje). –