CARREGANDO EM SEGUNDO PLANO

KERPLUNK 22/09/2016 17:10:16
#467312
Programação com métodos assíncronos, muda totalmente o paradigma. Mais adiante no canal vou fazer uns vídeos explicando sobre isso. é bem diferente o approach, se comparado com a programação [Ô]tradicional[Ô] síncrona. Comece por aqui
VARUS 22/09/2016 18:26:16
#467318
E o uso de thread ou backgroundwork? não é recomendável?
KERPLUNK 22/09/2016 19:01:55
#467319
A versão atual do .NET Framework, já suporta leitura de dados de forma assíncrona, ou seja, isso já é nativo e não requer grandes mudanças. O approach tradicional, é o que mostro nos meus vídeos no youtube:

Public Function GetCarros() As IEnumerable(Of Carro)

Dim connectionString = [Ô]Connection string vai aqui[Ô]

Using conn = New SqlConnection(connectionString)
Using cmd = New SqlCommand()

cmd.Connection = conn
cmd.CommandText = [Ô]seu comando de seleção vai aqui[Ô]
cmd.CommandType = CommandType.Text

conn.Open()

Using reader = cmd.ExecuteReader()

Return reader.[Select](Function(r) ConvertDataReaderToList(r)).ToList()
End Using
End Using
End Using
End Function


Simples e totalmente funcional. Quando o assunto é executar a mesma coisa de forma assíncrona, a mudança é sutil:


Public Function GetCarrosAsync() As Task(Of IEnumerable(Of Carros))

Dim connectionString = [Ô]Sua connection string vai aqui[Ô]

Dim asyncConnectionString = New SqlConnectionStringBuilder(connectionString) With { _
Key .AsynchronousProcessing = True _
}.ToString()

Using conn = New SqlConnection(asyncConnectionString)
Using cmd = New SqlCommand()

cmd.Connection = conn
cmd.CommandText = [Ô]Seu comando de selação vai aqui[Ô]
cmd.CommandType = CommandType.Text

conn.Open()

Using reader = Await cmd.ExecuteReaderAsync()

Return reader.[Select](Function(r) ConvertDataReaderToList(r)).ToList()
End Using
End Using
End Using
End Function

O método [Ô]Select[Ô] na leitura do DataReader é um método de extensão e é simplesmente um loop, uso ele para ficar mais simples:

Public NotInheritable Class Extensions
Private Sub New()
End Sub

<System.Runtime.CompilerServices.Extension> _
Public Shared Function [Select](Of T)(reader As SqlDataReader, projection As Func(Of SqlDataReader, T)) As IEnumerable(Of T)

While reader.Read()
yield Return projection(reader)
End While
End Function
End Class



Repare que a diferença entre o método síncrono e assíncrono é MÍNIMA. Usando dessa maneira, você vai ter o resultado que quer, a aplicação vai ficar [Ô]disponível[Ô] enquanto a leitura de dados é feita e quando pronta, você pode trabalhar com o resultado dela normalmente. A única diferença para [Ô]consumir[Ô] esses métodos é que você vai ter que usar a palavra chave [Ô]await[Ô] na frente da chamada do método.

Loguinho vou postar um vídeo mostrando como implementar e usar isso em cima dos vídeos que já estão no canal.
KERPLUNK 22/09/2016 19:17:52
#467320
Vejamos quem nota a diferença PRINCIPAL entre os dois métodos, o síncrono e o assíncrono
NICKOSOFT 23/09/2016 04:32:21
#467331
Pessoal q so copia e cola nunca vai se dar conta dessas 2 leves diferença, qnd muito vai apanhar na chamada de um deles
VARUS 25/09/2016 15:54:33
#467455
Tenho uma duvida nessas duas linhas

  Dim asyncConnectionString = New MySqlConnectionStringBuilder(connectionString) With {AsynchronousProcessing = True}.ToString()


fala que AsynchronousProcessing não foi declarado

e

  Return reader.[Select](Function(r) ConvertDataReaderToList(r)).ToList()


SELECT não é membro de DbDataReader
KERPLUNK 26/09/2016 12:52:33
#467496
Eu tinha certeza que alguém iria simplesmente copiar o código, colar e sair rodando. Vamos lá:
A linha referente à connection string, é simplesmente para adicionar o parâmetro de conexão assíncrona para o SQL Server. é um parâmetro obrigatório para o SQL Server, mas não quer dizer que vai funcionar exatamente igual para qualquer outro provider, como o MySQL. O código que coloquei, está PROPOSITALMENTE faltando alguns detalhes para rodar de forma totalmente assíncrona.
Quanto ao [Ô]erro[Ô] de [Ô]SELECT não é membro de DbDataReader[Ô], esse eu expliquei porque. SELECT é um método de extensão e está ali. Você precisa adicioná-lo à sua classe.

O que está ocorrendo: Você está cometendo o erro mais comum entre programadores iniciantes: Está tentando aprender por código. Como uma gama gigantesca de iniciantes, você imagina que tudo se resume à código e é indispensável para seu aprendizado. Posso dizer categorigamente que você está enganado. Código é resultado de conceito. Se você não entende conceito, nunca vai entender código, mesmo que eu postasse prontinho, mastigadinho, você não entenderia o que está acontecendo, mesmo que o código rodasse sem nenhuma exceção. Programação assíncrona, como já disse, é um conceito bastante complexo e não deve ser [Ô]encarado[Ô] por iniciantes sem antes entender PERFEITAMENTE como funciona a programação síncrona tradicional. E entender como funciona não quer dizer ter código funcionando, não é decorar comandos e sintaxe, nada disso. Você precisa [Ô]bater o olho[Ô] e entender o que está sendo feito.

Não me entenda mal, não estou menosprezando e nem menos fazendo pouco caso de você, muito pelo contrário! Aplaudo de pé a disposição para aprender e ter sempre melhor qualidade técnica. O caso é que estou te dando uma dica crucial que eu adoraria ter tido quando comecei: O caminho não é este. Eu achava também que tudo se resumia à código. Estudar conceitos é chato, massante e não produz resultados práticos. A coisa parece não render, entendo perfeitamente essa mentalidade, porque também já a tive. Mas garanto, mais de 20 anos de experiência me provaram o contrário inúmeras vezes. Conceitos são a BASE para progredir em programação. Ficaria feliz em explicar passo à passo como funciona programação assíncrona, mas este conceito só vai ser entendido por quem já tiver total conhecimento da programação tradicional de modo síncrono.
VARUS 26/09/2016 14:26:22
#467514
E por onde começo para entender como funciona o síncrono?

primeiramente kk qual a diferença entre sincrono e asincrono?
KERPLUNK 26/09/2016 15:14:36
#467516
A diferença é exatamente a diferença dos significados das palavras síncrono e assíncrono. Caso não saiba, explico: Síncrono é algo que acontece em sincronia, em cadência. Assíncrono não. Quando você faz uma consulta ao banco de dados por exemplo, você usa um objeto DataReader para isso. O DataReader é lido até o final e enquanto isso ocorre, nenhuma outra atividade pode ser executada, sua aplicação fica [Ô]presa[Ô] ao método sendo executado. No modelo assíncrono, essa atividade não limita sua aplicação, você pode fazer outras coisas enquanto o DataReader está sendo lido. Obviamente que o modelo de programação assíncrona não se aplica somente à leitura de banco de dados, mas à qualquer coisa que seja executada, desde que, o objeto sendo usado suporte chamadas assíncronas, ou seja, que sejam baseados em Task<T>.
No meu canal no youtube, mostro em detalhes como funciona o modelo tradicional de programação síncrona usando OOP. é um bom começo. Mas novamente, não fique apenas procurando código, não se concentre no código, tente entender os conceitos. Isso é a parte principal.
VARUS 30/09/2016 14:53:39
#467761
Consegui chegar +- até aqui;

     Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim TA = New MCliente

Dim list As List(Of Clientes) = Await TA.Todos
DataGridView1.DataSource = list

End Sub
End Class

Public Class MCliente
Public Async Function Todos() As Task(Of List(Of Clientes))
Dim SqlAll As String = [Ô]SELECT * FROM clientes;[Ô]
Dim result As New List(Of Clientes)
Try
Using conn As New MySqlConnection([Ô]server = localhost;user Id = root;password = 123456;database = test[Ô])
Using cmd As New MySqlCommand(SqlAll, conn)
conn.Open()
Using rdr As MySqlDataReader = Await cmd.ExecuteReaderAsync()
While rdr.Read()
result.Add(New Clientes(rdr.Item([Ô]idclientes[Ô]), rdr.Item([Ô]nome[Ô]), rdr.Item([Ô]idade[Ô])))
End While
End Using
End Using
End Using
Catch ex As Exception
MsgBox(ex.ToString)
End Try
Return result
End Function
End Class

Public Class Clientes
Public id As Integer
Public Property nome As String
Public Property idade As Integer

Public Sub New(_id As Integer, _nome As String, _idade As Integer)
Me.id = _id
Me.nome = _nome
Me.idade = _idade
End Sub
End Class


porém, a aplicação ainda da uma travada
Página 3 de 5 [50 registro(s)]
Faça seu login para responder