Próbuję wykonać działanie w tle, bez blokowania interfejsu użytkownika.Uruchamianie długich zadań bez zamrożenia interfejsu użytkownika
Oczywiście, mógłbym użyć BackgroundWorker do tego.
Jednak chciałbym to zrobić tylko za pomocą interfejsu API zadań.
Próbowałem:
async void OnTestLoaded(object sender, RoutedEventArgs e)
{
await LongOperation();
}
// It freezes the UI
i
async void OnTestLoaded(object sender, RoutedEventArgs e)
{
var task = Task.Run(()=> LongOperation());
task.Wait();
}
// It freezes the UI
Więc powinienem wrócić do BackgroundWorker? A może istnieje rozwiązanie korzystające tylko z Tasks?
Dlaczego tak wielu ludzi nie lubi BackgroundWorker? Podoba mi się i znajduję składnię wprost. – Paparazzi
'BackgroundWorker' jest znacznie lepszy niż" Thread ", ale API oparte na zadaniach ostatecznie zdominuje. Mam [powiązany wpis na blogu] (http://nitoprograms.blogspot.com/2010/08/various-implementations-of-asynchronous.html). 'Task.Run' ma następujące zalety: (1) umożliwia zagnieżdżanie; (2) wsparcie anulowania wykorzystuje zunifikowany system 'CancellationToken'; (3) wyjątki są propagowane bardziej naturalnie dzięki poprawnemu stosowi wywołań; (4) wyniki są uzyskiwane bardziej naturalnie; (5) wykorzystuje mniej zasobów (pulę wątków zamiast dedykowanego wątku). –