2012-09-22 9 views
7

mam ten wiersz kodu:Dlaczego pojawia się ostrzeżenie o kompilacji podczas korzystania z funkcji ContinueWith?

t.ContinueWith(_ => form.Close(), 
        TaskScheduler.FromCurrentSynchronizationContext()); 

... O której kompilator ma do powiedzenia:

Ostrzeżenie 2 Ponieważ to wywołanie nie jest oczekiwane, wykonanie bieżącej metody kontynuuje przed połączenie zostanie zakończone. Rozważ zastosowanie operatora "oczekuj" na wynik połączenia.

To nie był kod, który napisałem, ale pomyślałem, że to po prostu dodanie kontynuacji do końca istniejącego zadania. Nie myślałem, że to jest zadanie (lub kontynuacja). Czy na pewno ten proces jedynie modyfikacji zadania jest operacją synchroniczną? Dlaczego miałbym to mieć?

+0

Czy mogę Haz Suround Coud? –

+0

Czy możesz opublikować całą metodę? –

+1

Stephen, to jest twój kod :-) Zobacz http://stackoverflow.com/a/12513296/98422 –

Odpowiedz

8

Dlaczego miałbym to mieć await?

Nie musisz tego robić , dlatego jest to ostrzeżenie, a nie błąd. Ale jeśli jesteś w metodzie async i masz metodę, która zwraca nieoczekiwany obiekt, przez większość czasu nie powinieneś go ignorować.

W normalnym kodzie synchronicznym nie trzeba wykonywać żadnych specjalnych czynności, aby czekać na zakończenie wywoływanej przez siebie metody. Każde wywołanie metody zawsze blokuje się. Ale z metodami asynchronicznymi, musisz je naprawdę await, jeśli chcesz poczekać, aż się skończą. Ponadto, jeśli operacja asynchroniczna zakończy się niepowodzeniem i zgłasza wyjątek, nie będziesz wiedział o tym, dopóki nie uzyskasz wyniku tej metody (lub uzyskasz wyjątek od wyniku w inny sposób, na przykład wywołanie Wait(), jeśli jest to oczekiwane Task) .

Tak więc, jeśli zignorujesz zwróconą wartość w metodzie async, prawdopodobnie masz błąd w kodzie, którego ostrzeżenie próbuje uniknąć.

W twoim przypadku, ContinueWith() zwraca Task, który może być await ed, więc kompilator zakłada, że ​​powinienawait go. Ale w tym przypadku nie chcesz czekać, aż kontynuacja się zakończy i najprawdopodobniej nie wyrzuci wyjątku. Tak więc w tym przypadku ostrzeżenie jest fałszywie dodatnie, w rzeczywistości nie wskazuje problemu w kodzie.

+0

Świetna odpowiedź, dzięki. Czy jest coś, co mogę zrobić, aby powstrzymać pojawianie się ostrzeżenia, a tym samym przesłaniając wszystkie problemy z _actual_? (Nie chcę wyłączać ostrzeżenia w innych przypadkach, właśnie tutaj). –

+3

Możesz wyłączyć to tylko dla tej metody, jeśli dodasz '#pragma warning disable 4014' before then method i' #pragma warning restore 4014' after.Zazwyczaj zalecałbym naprawienie tego, na co narzeka ostrzeżenie, ale w tym przypadku tak naprawdę nie ma nic do naprawienia, więc wyłączenie ostrzeżenia tylko dla tej metody ma sens, jak sądzę. – svick

+1

Inną opcją jest przypisanie zadania do zmiennej. A następnie po prostu zignoruj ​​zmienną. – wasabi

Powiązane problemy