2013-08-05 18 views
15

nie przeczytałem kodu i przeczytałem, że zrozumiałem podstawy słów kluczowych oczekujących i asynchronicznych w odniesieniu do System.Threading.Task.Oczekiwanie na zadania: Zwróć zadanie lub poczekaj, jeśli po upływie

Nie jestem jednak pewien, czy mam rację, jeśli chodzi o mały problem, i szukam weryfikacji lub czy ktoś mnie poprawi.

mam wdrożenie metody asynchronicznej, z tym podpisem:

public Task ProcessUploadedFile(FileInfo info, string contentType); 

Oczywiście, jeśli chcę coś czekają wewnątrz metody, muszę dodać słowa kluczowego asynchronicznej do podpisu,

Moje pytanie brzmi następująco: jeśli ostatnią rzeczą, którą robi moja metoda, jest wywołanie innej metody asynchronicznej lub zwrócenie zadania, czy jest na to jakiś moment oczekiwania?

Np.

1:

public async Task ProcessUploadedFile(FileInfo info, string contentType) 
{ 
    foreach (var something in someCollection) 
    DoSomething(); 

    DoSomethingElse(); 

    await DoMethodAsync(); 
} 

2:

public Task ProcessUploadedFile(FileInfo info, string contentType) 
    { 
     foreach (var something in someCollection) 
     DoSomething(); 

     DoSomethingElse(); 

     return DoMethodAsync(); 
    } 

Początkowo pisał tego pierwszego, ale może już nie widzę sensu w dodaniu czekają. Gdybym miał napisać to ostatnie, osiągnąłem to samo, a osoba dzwoniąca z obu metod może nadal używać słowa kluczowego oczekującego, jeśli tak, nie?

Czy są jakieś różnice w powyższym? Który jest "lepszy"?

Odpowiedz

16

await służy do kontynuowania wykonywania treści metody w oczekiwaniu na zakończenie. Jeśli nie ma nic do kontynuowania, nie musisz czekać.

Możesz poczekać (uprościć) od operacji ContinueWith. Więc Twoja pierwsza metoda jest coś takiego:

foreach (var something in someCollection) 
    DoSomething(); 

DoSomethingElse(); 

DoMethodAsync().ContinueWith(t => {}); 

Jest ładny artykuł MSDN, który opisuje what happens in async method który ma ładny obraz przepływu kod:

enter image description here

+1

Świetnie, że to, co myślę. Dzięki! –

+1

Czekaj. Czy mogę po prostu coś wyjaśnić? W twojej przepisanej wersji mojego kodu masz DoSomething() i DoSomethingElse() w Task.Factory.StartNew() ... czy to prawda? Myślałem, że te bity będą działały synchronicznie, w tym samym wątku, co dzwoniący? I będzie to DoMethodAsync(). ContinueWith (t => {} _); ? –

+1

@dark_perfect Przepraszam, był w pośpiechu. I tak, masz całkowitą rację. Zaktualizowany kod: –

Powiązane problemy