Esileht > Uncategorized > Erinevate ülesannete rööpkäivitamine

Erinevate ülesannete rööpkäivitamine


Seni oleme vaadanud, kuidas andmeid rööpselt töödelda. Aga tegelikult saab rööpselt käivitada täiesti erinevaid ülesandeid.

Toome näite: programmi käivitamisel on vaja internetist alla laadida 3 faili. Esimene asi, mis pähe kargab, on teha seda asünkroonselt WebClient.DownloadStringAsync abil. Pole paha mõte. Iga DownloadStringCompleted sündmus kontrollib, kas kõik failid on juba alla tulnud või on mõni veel puudu.

Parallel.Invoke()

Rööplemine on siin palju lihtsam:

string a = "", b = "", c = "";
      
Parallel.Invoke
(
  () => { a = new WebClient().DownloadString("http://1.com"); },
  () => { b = new WebClient().DownloadString("http://2.com"); },
  () => { c = new WebClient().DownloadString("http://3.com"); }
);

Parallel.Invoke() võtab nii palju funktsioone, kui sa tahad anda, ja lõpetab siis, kui kõik need on valmis saanud. Antud juhtumil lõpetatakse siis pärast kõigi kolme stringi allalaadimist. Lihtne, kas pole?

Task.Factory

Teine tore loom on Task.Factory, mis võimaldab luua ülesandeid ühekaupa ja siis nende täitmist ootama jääda.

List<Task> tasks = new List<Task>();
tasks.Add(Task.Factory.StartNew(() => { a = new WebClient().DownloadString("http://1.com&quot;); }));
tasks.Add(Task.Factory.StartNew(() => { b = new WebClient().DownloadString("http://2.com&quot;); }));
tasks.Add(Task.Factory.StartNew(() => { c = new WebClient().DownloadString("http://3.com&quot;); }));
Task.WaitAny(tasks.ToArray(), TimeSpan.FromSeconds(5));

Task.Factory.StartNew() tagastab viivitamatult Task-objekti, käivitades ülesande taustal.

Task.WaitAll() võtab suvalise arvu ülesandeid (Task-objekte) ja ootab, kuni kõik on täidetud. Lisatingimusena võib anda ajalõpu limiidi.

Teine sarnane meetod on Task.WaitAny(), mis ootab, kuni ükskõik milline ülesannetest on täidetud. Selle tagastudes on tavaliselt täitunud ainult üks ülesannetest.

Jep, rööplemine on tõesti mõnus. Üldiselt ei ole see hädavajalik, sest teiste meetoditega võib saavutada samu tulemusi, kuid see on lihtne kasutada ja loogiliselt üles ehitatud. Ja loomulikult on selline kood palju paremini loetav.

Rubriigid:Uncategorized
  1. Kommentaare veel pole.
  1. No trackbacks yet.

Lisa kommentaar

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Muuda )

Twitter picture

You are commenting using your Twitter account. Log Out / Muuda )

Facebook photo

You are commenting using your Facebook account. Log Out / Muuda )

Google+ photo

You are commenting using your Google+ account. Log Out / Muuda )

Connecting to %s

%d bloggers like this: