2013-10-01 22 views
5

Chcę odblokować ui za pomocą wątków.Zadanie i odblokowanie interfejsu użytkownika

Czy możesz mi powiedzieć, jaka jest różnica pomiędzy tym kodem:

private async void button1_Click(object sender, EventArgs e) 
{ 
    int result = await Calculate(1, 2); 

    label1.Text = result.ToString(); 
} 

private async Task<int> Calculate(int number1, int number2) 
{ 
    return await Task.Run(() => 
    { 
     Thread.Sleep(5000); 
     return number1 + number2; 
    }); 
} 

I ten kod:

private async void button1_Click(object sender, EventArgs e) 
{ 
    int result = await Calculate(1, 2); 

    label1.Text = result.ToString(); 
} 

private async Task<int> Calculate(int number1, int number2) 
{ 
    await Task.Delay(5000); 
    return number1 + number2; 
} 
+0

możliwy duplikat [Thread.Sleep kontra Task.Delay?] (Http://stackoverflow.com/questions/17258428/thread-sleep-vs-task-delay) – Muctadir

Odpowiedz

2

Główną różnicą jest to, że Task.Run tworzy nowy wątek (patrz this MSDN documentation sekcja wątków).
Tak więc nowy wątek stworzony bloków przez 5 sekund w pierwszym przypadku, a następnie zwraca wynik (Tymczasem główny wątek jest gotowy do użycia, więc czekają powraca kontrolę do wywołującego z Task.Run(...))

W sekundę Sprawa też, po oczekiwaniu, kontrola jest przekazywana do dzwoniącego, a Task.Delay dzieje się w głównym wątku. Nie utworzono nowego wątku.

Tak jak wspomniano w odpowiedzi na pytanie, czy chcesz iść do wielowątkowości, wykorzystując Task.Run() wraz z async i await daje wiele możliwości.

Aby uzyskać więcej informacji na temat sterowania przepływem async i await, należy zapoznać się z wyżej wymienioną dokumentacją. Jest to bardzo pomocne i szczegółowe MSDN przeczytać!

Powiązane problemy