CARREGANDO EM SEGUNDO PLANO
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
E o uso de thread ou backgroundwork? não é recomendável?
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:
Simples e totalmente funcional. Quando o assunto é executar a mesma coisa de forma assÃncrona, a mudança é sutil:
O método [Ô]Select[Ô] na leitura do DataReader é um método de extensão e é simplesmente um loop, uso ele para ficar mais simples:
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.
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.
Vejamos quem nota a diferença PRINCIPAL entre os dois métodos, o sÃncrono e o assÃncrono
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
Tenho uma duvida nessas duas linhas
fala que AsynchronousProcessing não foi declarado
e
SELECT não é membro de DbDataReader
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
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.
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.
E por onde começo para entender como funciona o sÃncrono?
primeiramente kk qual a diferença entre sincrono e asincrono?
primeiramente kk qual a diferença entre sincrono e asincrono?
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.
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.
Consegui chegar +- até aqui;
porém, a aplicação ainda da uma travada
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
Faça seu login para responder