rioinfo2012

53
PROGRAMAÇÃO CONCORRENTE EM .NET 4.5 JUAN LOPES twitter.com/juanplopes github.com/juanplopes

description

PROGRAMAÇÃO ASSÍNCRONA EM .NET 4.5

Transcript of rioinfo2012

Page 1: rioinfo2012

PROGRAMAÇÃO CONCORRENTE EM .NET 4.5

JUAN LOPEStwitter.com/juanplopesgithub.com/juanplopes

Page 2: rioinfo2012

PROGRAMAÇÃO TALVEZ CONCORRENTE EM .NET 4.5

JUAN LOPEStwitter.com/juanplopesgithub.com/juanplopes

Page 3: rioinfo2012

PROGRAMAÇÃO ASSÍNCRONA EM .NET 4.5

JUAN LOPEStwitter.com/juanplopesgithub.com/juanplopes

Page 4: rioinfo2012

EU PROGRAMO WEB

Page 5: rioinfo2012

EU PROGRAMO WEB

POR QUE PROGRAMAR ASSINCRONAMENTE?

Page 6: rioinfo2012

EU PROGRAMO WEB

POR QUE PROGRAMAR ASSINCRONAMENTE?

MENOR LATÊNCIAMAIOR RESPONSIVIDADE

Page 7: rioinfo2012

WINDOWS XPWINDOWS FORMS

NÃO BLOQUEIE A THREAD DA UI

Page 8: rioinfo2012

WINDOWS 8WINRT

NÃO BLOQUEIE A THREAD DA UI

Page 9: rioinfo2012

I/O vs CPU

Page 10: rioinfo2012

I/O vs CPUI/O É MAIS CARO

Page 11: rioinfo2012

I/O vs CPU

I/O É MAIS LENTO

Page 12: rioinfo2012

I/O vs CPU

I/O É MAIS LENTODISCOREDE

BANCO DE DADOS

Page 13: rioinfo2012

PROGRAMAÇÃOCONCORRENTE

Page 14: rioinfo2012

PROGRAMAÇÃOCONCORRENTE

THREADS

Page 15: rioinfo2012

PROGRAMAÇÃOCONCORRENTE

É DIFÍCIL

Page 16: rioinfo2012

PROGRAMAÇÃOCONCORRENTE

É DIFÍCIL

OU NÃO

Page 17: rioinfo2012

COMO NÃO FAZER:

new Thread(() =>{ //código lento}).Start();

Page 18: rioinfo2012

TALVEZ NÃO PROGRAMAR CONCORRENTEMENTE?

Page 19: rioinfo2012

TALVEZ NÃO PROGRAMAR CONCORRENTEMENTE?

TALVEZ ASSINCRONAMENTE

Page 20: rioinfo2012

MAS ANTES,O QUE TEMOS HOJE?

Page 21: rioinfo2012

ATÉ .NET 3.5BeginInvokeEndInvoke

Page 22: rioinfo2012

Func<string> ler = () => File.ReadAllText(@"C:\test.txt");

var handle = ler.BeginInvoke(null, null);

//qualquer outro código

var resultado = ler.EndInvoke(handle);

Page 23: rioinfo2012

var req = WebRequest.Create("http://google.com");var handle = req.BeginGetRequestStream(null, null);

//qualquer código

var stream = req.EndGetRequestStream(handle);

Page 24: rioinfo2012

ATÉ .NET 3.5Begin[QualquerCoisa]End[QualquerCoisa]

Page 25: rioinfo2012

ATÉ .NET 3.5Begin[QualquerCoisa]End[QualquerCoisa]

THREADSRACE CONDITIONSMAIS COMPLICADO

Page 26: rioinfo2012

.NET 4.0PARALLEL EXTENSIONS

PLINQ (Parallel LINQ)+

TPL (Task Parallel Library)

Page 27: rioinfo2012

.NET 4.0PLINQ (Parallel LINQ)

Page 28: rioinfo2012

var files = new[] {"file1.txt", "file2.txt"};

var contents = string.Join("", files .AsParallel() .Select(File.ReadAllText) .ToArray());

Page 29: rioinfo2012

.NET 4.0TPL (Task Parallel Library)

Page 30: rioinfo2012

.NET 4.0TPL (Task Parallel Library)

Task<T>

Page 31: rioinfo2012

var task = Task.Run(() => File.ReadAllText(@"C:\test.txt"));

//qualquer outro código

var resultado = task.Result;

Page 32: rioinfo2012

.NET 4.0TPL (Task Parallel Library)

THREADSRACE CONDITIONS

MENOS COMPLICADO

Page 33: rioinfo2012

.NET 4.5ASYNCAWAIT

Page 34: rioinfo2012

fs.readFile('test.txt', function (err, data) { if (err) throw err; console.log(data);});

Page 35: rioinfo2012

Task.Run(() => File.ReadAllText(@"test.txt")) .ContinueWith(x => Console.WriteLine(x.Result));

Page 36: rioinfo2012

var task = Task.Run(() => File.ReadAllText(@"test.txt"));

task.ContinueWith(x => Console.WriteLine(x.Result));

Page 37: rioinfo2012

var task = Task.Run(() => File.ReadAllText(@"test.txt"));

Console.WriteLine(await task);

Page 38: rioinfo2012

static async Task<int> GoogleMaisYahoo(){ var http = new HttpClient(); var google = http.GetStringAsync("http://google.com"); var yahoo = http.GetStringAsync("http://yahoo.com");

return (await google).Length + (await yahoo).Length;}

static void Main(string[] args){ var task = GooglePlusYahoo();

//qualquer código Console.WriteLine(task.Result); Console.ReadLine();}

Page 39: rioinfo2012

static Task<int> GooglePlusYahoo(){ var http = new HttpClient(); var google = http.GetStringAsync("http://google.com"); var yahoo = http.GetStringAsync("http://yahoo.com"); return Task.WhenAll(google, yahoo) .ContinueWith(x => x.Result[0].Length + x.Result[1].Length);}

static void Main(string[] args){ var task = GooglePlusYahoo();

//qualquer código

Console.WriteLine(task.Result); Console.ReadLine();}

Page 40: rioinfo2012

.NET 4.5ASYNCAWAIT

SEM THREADSSEM RACE CONDITIONSMUITO MENOS COMPLICADO

Page 41: rioinfo2012

RESOLVE 92.4242% DOS PROBLEMAS QUE

THREADS RESOLVEM, APROXIMADAMENTE

Page 42: rioinfo2012
Page 43: rioinfo2012

private async void button1_Click(object sender, EventArgs e){ var http = new HttpClient(); page.Text = "Loading..."; page.Text = await http.GetStringAsync("http://google.com");}

Page 44: rioinfo2012

private async void button1_Click(object sender, EventArgs e){ var http = new HttpClient(); page.Text = "Loading..."; page.Text = await http.GetStringAsync("http://google.com");}

MESMA THREAD QUE CHAMOU O MÉTODO

POTENCIALMENTE NOVA THREAD

Page 45: rioinfo2012

ENTÃO CONTINUAMOS COM THREADS

BLOQUEADAS EM I/O?

Page 46: rioinfo2012

ENTÃO CONTINUAMOS COM THREADS

BLOQUEADAS EM I/O?

NÃO

Page 47: rioinfo2012

IOCP

Page 48: rioinfo2012

IOCPI/O COMPLETION PORTS

FUNCIONALIDADE DO S.O.ASYNC "THREADLESS" I/O

Page 49: rioinfo2012

NÃO HÁ THREADS BLOQUEADAS ESPERANDO

CADA I/O TERMINAR

Page 50: rioinfo2012

NÃO HÁ THREADS BLOQUEADAS ESPERANDO

CADA I/O TERMINAR

HÁ UMA ÚNICA THREAD DE IOQUE LÊ UMA FILA

Page 51: rioinfo2012

MÉTODOS DA BCL QUE TERMINAM COM "ASYNC", GERALMENTE USAM IOCP

Page 52: rioinfo2012

MÉTODOS DA BCL QUE TERMINAM COM "ASYNC", GERALMENTE USAM IOCP

FileStream#ReadAsyncHttpClient#GetStringAsync

Socket#SendAsync

Page 53: rioinfo2012

OBRIGADO!

TWITTER.COM/JUANPLOPESGITHUB.COM/JUANPLOPES