Professional Documents
Culture Documents
Poboljšanje Propusnosti: Primer - Osnovni Problem
Poboljšanje Propusnosti: Primer - Osnovni Problem
Poboljšanje Propusnosti: Primer - Osnovni Problem
Poboljanje propusnosti
1
11/30/2015
Produavanje niti
} {
button1.BackColor = Color.Red;
System.Threading.Thread.Sleep(2000);
}
2
11/30/2015
Sinhronizacija niti
3
11/30/2015
Paralelizam
4
11/30/2015
Primer 1b. Primer jedne metode koja se asinhrono izvrava, ali i dalje sporo!
void velikiRacun()
{
for (int i = 1; i < 5; i++)
{
velikiRacunModifikovan(i);
}
this.BackColor = Color.Green;
}
void velikiRacunModifikovan(object i)
{
System.Threading.Thread.Sleep((int)1000);
}
5
11/30/2015
System.Threading.Thread.Sleep((int)1000); t[i].Start();
} }
Task.WaitAll(t);
this.BackColor = Color.Green;
}
void velikiRacunModifikovan(int i)
{
System.Threading.Thread.Sleep((int)1000);
}
Parallel.For
Definie petlju u kojoj se svaka iteracija moe izvravati paralelno u posebnom zadatku.
Metoda ima poetnu, krajnju vrednost i metodu koja prima celobrojnu vrednost.
Parallel.For(0, 5, velikiRacunModifikovan);
Parallel.ForEach<T>
Slino iskazu foreach, definie petlju u kojoj se sve iteracije mogu paralelno izvravati. Iskaz
prima argument tipa Ienumerable<T> i upuuje se na metodu koja prima argument tipa T
int[] i = { 0,1,2,3,4 };
Parallel.ForEach<int>(i, velikiRacunModifikovan);
6
11/30/2015
Parallel.Invoke
Izvravanje skupa metoda bez parametara kao paralelnih zadataka. Na
primer:
Paralell.Invoke(metod1, metod2, trecametoda);
Obustavljanje zadataka
7
11/30/2015
Primer
CancellationTokenSource cancelS = new void velikiRacun(object t)
CancellationTokenSource(); {
CancellationToken cancelT; CancellationToken token = (CancellationToken)t;
System.Threading.Thread.Sleep((int)5000);
private void button1_Click(object sender, EventArgs e) if (token.IsCancellationRequested)
{ {
cancelT = cancelS.Token; this.BackColor = Color.Green;
Action<object> a = velikiRacun; return;
Task t = new Task(a, cancelT); }
t.Start(); System.Threading.Thread.Sleep((int)15000);
} this.BackColor = Color.Green;
}
private void button2_Click(object sender, EventArgs e)
{
cancelS.Cancel();
}
Asinhrone opoeracije
8
11/30/2015
Asinhrone operacije
Napomena: Za prvi kod poruka se pojavljuje nakon 10sek a drugi odmah. Za prvi sluaj imamo
blokiranje, a u drugom netano prikazivanje poruke o zavretku posla.
Koje su opcije?
1. Saekati da se zavre zadaci pa onda pokazati poruku
private void button1_Click(object sender, EventArgs e)
{
Task t = new Task(dugotrajnaMetoda1);
t.ContinueWith(dugotrajnaMetoda2);
t.Start();
t.Wait();
label1.Text = "KRAJ";
}
Problem blokiranja tekue niti ostaje.
9
11/30/2015
Meutim pojavljuje se
Objanjenje problema
i novo reenje
Samo nit korisnikog interfejsa moe da upravlja kontrolama interfejsa!
Reenje je u korienju metode Invoke
private void button1_Click(object sender, EventArgs e)
{
Task t = new Task(dugotrajnaMetoda1);
t.ContinueWith(dugotrajnaMetoda2);
t.ContinueWith(poruka);
t.Start();
}
10
11/30/2015
.NET 4.0 uvodi nov pristup, nazvan asinhroni ablon baziran na zadacima. Pre
uvoenja ovog ablona kada su programeri elili da reavaju neki problem
asinhrono, morali su da definiu redosled izvravanja, dok im je ovaj sablon
im je omogucio da rade sa kodom kao da je sinhron.
Instanca Task klase ukazuje na vrednost koja e biti prosleena u odreenom
trenutku u budunosti. Ne treba da brinete kako i u kojoj niti e se izraunavati
ova vrednost. Treba samo da znate da je neophodno izvesno vreme za odreivanje
rezultata, a vi moete da koristite Task objekat za spreavanje blokiranja
trenutnog izvravanja dok ekate rezultate.
Pomou Task objekta moete da proveravate status asinhronog izvravanja,
da ekate da se izvravanje okona, odnosno da dobijete rezultujuu
vrednost. Postoji ak i generika vrednost ove klase Task<TResault> koju
moete da koristite prilikom pristupanja rezultatima razliiih asinhronih
operacija u kojima se primenjuje jaka tipiziacija.
11
11/30/2015
Reenje 1.
private async void button1_Click(object sender, }
EventArgs e)
{ private void dugotrajnaMetoda1()
await dugotrajnaMetodaA(); {
await dugotrajnaMetodaB(); System.Threading.Thread.Sleep(5000);
}
label1.Text = "KRAJ"; private void dugotrajnaMetoda2()
} {
System.Threading.Thread.Sleep(5000);
private Task dugotrajnaMetodaA() }
{
Task t = new Task(dugotrajnaMetoda1);
t.Start();
return t;
}
private Task dugotrajnaMetodaB()
{
Task t = new Task(dugotrajnaMetoda2);
t.Start();
return t;
12
11/30/2015
Reenje 2.
private async void button1_Click(object sender, EventArgs e)
{
Task t1 = Task.Run(new Action(dugotrajnaMetoda1));
private async void button1_Click(object Task t2 = Task.Run(new Action(dugotrajnaMetoda2));
sender, EventArgs e)
{ await t1;
await t2;
Task t1 = new Task(dugotrajnaMetoda1);
t1.Start(); label1.Text = "KRAJ";
}
Task t2 = new Task(dugotrajnaMetoda2);
t2.Start();
await t1;
await t2;
private async void button1_Click(object sender, EventArgs e)
label1.Text = "KRAJ"; {
Task t1 = Task.Run(()=> { System.Threading.Thread.Sleep(5000); });
} Task t2 = Task.Run(() => { System.Threading.Thread.Sleep(5000); });
await t1;
await t2;
label1.Text = "KRAJ";
}
private void button1_Click(object sender, EventArgs e) private void button1_Click(object sender, EventArgs e)
{ {
Task<bool> task = new Task<bool>(velikiObracun); Task<bool> task = Task.Run(()=>velikiObracun());
task.Start(); task.Start();
bool velikiObracun()
{
System.Threading.Thread.Sleep(5000);
return true;
}
13
11/30/2015
14