rioinfo2012

Post on 24-May-2015

751 views 0 download

description

PROGRAMAÇÃO ASSÍNCRONA EM .NET 4.5

Transcript of rioinfo2012

PROGRAMAÇÃO CONCORRENTE EM .NET 4.5

JUAN LOPEStwitter.com/juanplopesgithub.com/juanplopes

PROGRAMAÇÃO TALVEZ CONCORRENTE EM .NET 4.5

JUAN LOPEStwitter.com/juanplopesgithub.com/juanplopes

PROGRAMAÇÃO ASSÍNCRONA EM .NET 4.5

JUAN LOPEStwitter.com/juanplopesgithub.com/juanplopes

EU PROGRAMO WEB

EU PROGRAMO WEB

POR QUE PROGRAMAR ASSINCRONAMENTE?

EU PROGRAMO WEB

POR QUE PROGRAMAR ASSINCRONAMENTE?

MENOR LATÊNCIAMAIOR RESPONSIVIDADE

WINDOWS XPWINDOWS FORMS

NÃO BLOQUEIE A THREAD DA UI

WINDOWS 8WINRT

NÃO BLOQUEIE A THREAD DA UI

I/O vs CPU

I/O vs CPUI/O É MAIS CARO

I/O vs CPU

I/O É MAIS LENTO

I/O vs CPU

I/O É MAIS LENTODISCOREDE

BANCO DE DADOS

PROGRAMAÇÃOCONCORRENTE

PROGRAMAÇÃOCONCORRENTE

THREADS

PROGRAMAÇÃOCONCORRENTE

É DIFÍCIL

PROGRAMAÇÃOCONCORRENTE

É DIFÍCIL

OU NÃO

COMO NÃO FAZER:

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

TALVEZ NÃO PROGRAMAR CONCORRENTEMENTE?

TALVEZ NÃO PROGRAMAR CONCORRENTEMENTE?

TALVEZ ASSINCRONAMENTE

MAS ANTES,O QUE TEMOS HOJE?

ATÉ .NET 3.5BeginInvokeEndInvoke

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

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

//qualquer outro código

var resultado = ler.EndInvoke(handle);

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

//qualquer código

var stream = req.EndGetRequestStream(handle);

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

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

THREADSRACE CONDITIONSMAIS COMPLICADO

.NET 4.0PARALLEL EXTENSIONS

PLINQ (Parallel LINQ)+

TPL (Task Parallel Library)

.NET 4.0PLINQ (Parallel LINQ)

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

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

.NET 4.0TPL (Task Parallel Library)

.NET 4.0TPL (Task Parallel Library)

Task<T>

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

//qualquer outro código

var resultado = task.Result;

.NET 4.0TPL (Task Parallel Library)

THREADSRACE CONDITIONS

MENOS COMPLICADO

.NET 4.5ASYNCAWAIT

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

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

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

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

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

Console.WriteLine(await task);

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();}

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();}

.NET 4.5ASYNCAWAIT

SEM THREADSSEM RACE CONDITIONSMUITO MENOS COMPLICADO

RESOLVE 92.4242% DOS PROBLEMAS QUE

THREADS RESOLVEM, APROXIMADAMENTE

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

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

ENTÃO CONTINUAMOS COM THREADS

BLOQUEADAS EM I/O?

ENTÃO CONTINUAMOS COM THREADS

BLOQUEADAS EM I/O?

NÃO

IOCP

IOCPI/O COMPLETION PORTS

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

NÃO HÁ THREADS BLOQUEADAS ESPERANDO

CADA I/O TERMINAR

NÃO HÁ THREADS BLOQUEADAS ESPERANDO

CADA I/O TERMINAR

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

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

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

FileStream#ReadAsyncHttpClient#GetStringAsync

Socket#SendAsync

OBRIGADO!

TWITTER.COM/JUANPLOPESGITHUB.COM/JUANPLOPES