Created by Thiago Russo
over 8 years ago
|
||
Question | Answer |
QUAL/QUAIS PROBLEMA(S) Asynchronous code resolve? | Qdo a app está executando uma operação de I/O, o SO percebe que a app está aguardando a conclusão da operação, como acesso a um arquivo na rede e isso pode custar tempo. Com isso, o Windows PAUSA sua Thread para q n use CPU Mas ainda utiliza memória e a Thread ñ pode ser reutilizada por outras requisições, precisando criar novas Threads |
COMO Asynchronous code resolve os problemas? | Ao invés de BLOQUEAR a Thread enquanto aguarda I/O, vc recebe um obj Task, com o resultado da operação assíncrona. Com Continuation Task, vc pode continuar o trabalho qdo o I/O terminar. Enquanto isso, a Thread está disponível para outros trabalhos. Qdo I/O acaba, o SO notifica o runtime e a Continuation Task é agendada p/ o pool de Threads. |
async | Marca o método p/ operações assíncronas, sinalizando p/ o processador q algo assíncrono vai acontecer nesse método. Um método marcado com async, começa a ser executado de forma síncrona na Thread atual. Ele PERMITE q o método possa ser DIVIDIDO em VÁRIAS PARTES. Os limites dessas partes são marcadas c/ AWAIT |
await | Com await, o compilador gera o código que irá verificar se a operação assíncrona está concluída. Se SIM, o método continua a execução de forma síncrona. Se NÃO, o state machine vai associar um método de continuação q deve ser executado qdo a Task for concluída. Com isso a Thread poderá ser reutilizada em outros trabalhos Await permite que vc escreva códigos que parece síncrono, mas que se comporta de forma assíncrona. |
Exemplo async / await | |
async e await deixam para o compilador fazer a parte complexa | async e await deixam para o compilador gerar código em passos precisos, pois escrever códigos assíncronos na mão é difícil. |
Como await melhora a capacidade de resposta? | Descarregando operações de longa duração em outras Threads deixando a aplicação cliente manter-se ágil, enquanto as operações são executadas em 2º plano Isso NÃO melhora o desempenho, mas MELHORA A CAPACIDADE DE RESPOSTA await tb garante q o restante do método usa a Thread de interface correta, para q vc possa atualizar/interagir c/ a interface de usuário |
Exemplo de escalabilidade com await, utilizando Sleep | |
Exemplo de escalabilidade com await, utilizando FileStream | FileStream expõe: WriteAsync e ReadAsync Eles não utilizam uma Thread enquanto estão à espera do Disco |
Synchronization Context (SC) | Liga o modelo da app ao modelo de Threads. Abstrai a forma que aplicações funcionam e garante que vc trabalhe na Thread correta qdo precisar atualizar algo na UI ou processar uma requisição web |
Synchronization Context (SC): Utilizando await no WPF x Asp.Net | await garante que o SC atual é salvo e restaurado qdo a Task for concluída. WCF => após a Task terminar, o prog continua na Thread do usuário. Ex: usa uma única Thread de UI e potencialmente mtas Threads em 2º plano, melhorando a cap. de resposta, distribuindo trabalho entre as CPU's Asp.Net => o restante do código é executado em uma Thread que tem culture, principal e + informações. Ex: usa o pool de Threads que são inicializados com esses dados. |
Quando Desativar o Synchronization Context ? | Talvez o código possa ser executado em qlq Thread, pq não precisa atualizar a UI qdo terminar. Neste caso, desativar o SC, o código será melhor executado. |
Exemplo de desativar o Synchronization Context que gera Exception | |
Exemplo de desativar o Synchronization Context sem gerar Exception | |
async / await tipos de retorno | - ao criar métodos async, é importante estabelecer o tipo de retorno Task ou Task<T> - Evite void, exceto quando for um event handler. Void é do tipo "despare e esqueça" e vc ñ poderá inspecionar o retorno e exceptions lançadas - Nunca crie métodos com async e sem await |
Want to create your own Flashcards for free with GoConqr? Learn more.