FUN?ÃO ASSINCRONA

NOWLIGHTS 02/11/2017 23:26:32
#477567
Boa noite galera...

Tava dando uma olhada sobre métodos assíncronos e tentei utilizar na minha função;

   Public Shared Async Function SearchAca() As Task(Of List(Of Produtos_ACA))
Dim SQL As String = [Ô]SELECT * FROM produtos_aca Where IdCliente=[ô][Ô] & GetCliente.ID_M & [Ô][ô][Ô]
Dim Result = New List(Of Produtos_ACA)
Try
Using Conex As New MySqlConnection(GetSQL.SERVIDOR)
Using Cmd As New MySqlCommand(SQL, Conex)
Try
Await Conex.OpenAsync
Catch ex As Exception
Erro.ShowMe([Ô]Erro inesperado ao tentar abrir conexão com o servidor :/[Ô], ex.ToString, True)
End Try
Using Ler As MySqlDataReader = Await Cmd.ExecuteReaderAsync
While Await Ler.ReadAsync
Result.Add(New Produtos_ACA(Ler.Item([Ô]Id[Ô]), Ler.Item([Ô]IdCliente[Ô]), Ler.Item([Ô]IdProduto[Ô])))
End While
End Using
End Using
End Using
Catch ex As Exception
Erro.ShowMe([Ô]Erro inesperado[Ô], ex.ToString,, [Ô]Erro em: MetodoNotificar.SearchACA[Ô])
End Try
Return (Result)
End Function


E tentei utilizar a lista assim;

   Dim LisAc = SearchAca()
For Each I As Produtos_ACA In LisAc

Next


E aparece: Expressão é do tipo [Ô]Task(Of List(Of Produtos_ACA))[Ô], que não é um tipo de coleção.

Porque?
JABA 03/11/2017 03:33:26
#477570
Citação:

Dim LisAc = SearchAca()



Quando você declara o [Ô]dim[Ô] desta maneira, a plataforma tenta descobrir qual o tipo pra você dinamicamente. Como o tipo de retorno do seu método tá declarado como uma task, então a variável LisAc passará a ser uma task também, por isso gera um erro ao fazer loop, pois ela não é uma coleção.

Não sei se vai funcionar, mas tente declarar explicitamente, assim:

Dim LisAc as List = SearchAca()




OCELOT 03/11/2017 08:23:03
#477571
Resposta escolhida
Sua função SearchAca é assíncrona com retorno de valor, então para poder usar corretamente ela a função que a chama também deve ser assíncrona e deve usar
Dim LisAc = Await SearchAca()
KERPLUNK 03/11/2017 11:19:10
#477572
Outra coisa importante, métodos assíncronos no connector MySQL são relativamente novos, De acordo com a documentação, você precisa usar .NET Framework 4.0 ou superior e versão 6.9(UI!!!) ou superior do conector
NOWLIGHTS 03/11/2017 16:38:09
#477575
Funcionou...

Seria interessante, colocar métodos assíncronos em todas as minhas funções da classe? Seria uma boa prática? (levando em consideração a quantidade grande de dados)
KERPLUNK 03/11/2017 16:47:48
#477576
Se for necessário o uso de métodos assíncronos, sim. Mas não é [Ô]boa prática[Ô] necessariamente. Métodos assíncronos são usados quando processamento assíncrono é necessário. Não são [Ô]melhores[Ô] ou [Ô]piores[Ô] que métodos síncronos. Você não terá nenhum ganho de performance, se é o que você está querendo...
NOWLIGHTS 03/11/2017 16:50:06
#477577
Mas não travar a tela, já não seria um [Ô]ganho de performance[Ô]
KERPLUNK 03/11/2017 17:23:00
#477579
Um bom motivo para usar aplicações Web, onde esse tipo de coisa é bem diferente. Você pode ter um controle(componente) sendo carregado em background de modo assíncrono, assim como vários outros, tudo ao mesmo tempo.
Tópico encerrado , respostas não são mais permitidas