Salve galera. Na verdade, eu já havia feito uma postagem sobre isso no passado. Mas decidi reescrever algumas partes do código e atualizar o projeto (de Portable Class Library) para uma Class Library(.NET CORE 2) que é multi plataforma.
O funcionamento é o mesmo, a diferença principal fica pelo suporte à assincronicidade permitindo que você use métodos async e use await.
Esse é mais um projeto livre e open source que estou disponibilizando no meu GITHUB.
Os códigos estão sumarizados(documentados) e acompanham um Demo em WPF.
Abaixo uma pequena porção de código:
/// /// O código abaixo é um exemplo simples de como usar os webservices de moeda de forma assíncrona /// /// public static async Task AsyncExample() { HL.YahooCurrency.Currency currency = new HL.YahooCurrency.Currency(); //VOCÊ DEVE INCLUIR A LINHA ABAIXO OBRIGATORIAMENTE //É de extrema importância que você use o método WaitLoad() para aguardar a inicialização desse objeto, que ocorre de forma assíncrona await currency.WaitLoad(); //Seleciona a moeda de origem currency.SourceUnit = currency.Units.ElementAt(0); //Seleciona a moeda de destino, para a qual se quer converter um valor currency.OutputUnit = currency.Units.ElementAt(1); //Dá um valor para conversão currency.SourceValue = 2.32f; //Mostra o valor convertido para a moeda de destino System.Diagnostics.Debug.WriteLine(currency.OutputValue); } /// /// O código abaixo é um exemplo simples de como usar os webservices de moeda de forma síncrona(normal) /// public static void SynchronousExample() { HL.YahooCurrency.Currency currency = new HL.YahooCurrency.Currency(); //VOCÊ DEVE INCLUIR A LINHA ABAIXO OBRIGATORIAMENTE //É de extrema importância que você use o método WaitLoad() para aguardar a inicialização desse objeto, que ocorre de forma assíncrona //Ao invés de usar await, você pode usar o método .Wait() em contextos síncronos. //Dessa forma, a thread em execução irá ser bloqueada por algumas frações de tempo, até que o carregamento dos dados seja feito completamente //Normalmente, isso deverá tomar cerca de 1 segundo, mas em conexões de internet mais lentas, pode levar até 6. Ou seja, a interface de usuário irá ficar bloqueada durante esse tempo currency.WaitLoad().Wait(); //Seleciona a moeda de origem currency.SourceUnit = currency.Units.ElementAt(0); //Seleciona a moeda de destino, para a qual se quer converter um valor currency.OutputUnit = currency.Units.ElementAt(1); //Dá um valor para conversão currency.SourceValue = 2.32f; //Mostra o valor convertido para a moeda de destino System.Diagnostics.Debug.WriteLine(currency.OutputValue); }
Gostou?
Detalhe, esse objeto YahooCurrency pode ser usado diretamente no XAML, pois ele implementa a interface INotifyPropertyChanged, permitindo que seja feito Data Bindings. Quando usando em XAML ele irá operar, por padrão, de forma assíncrona. Você deverá utilizar a propriedade IsLoading para exibir alguma mensagem de carregamento para o usuário (enquanto os dados são baixados) e/ou desabilitar os controles da interface.
Isso tudo que mencionei acima está implementado no exemplo em WPF que acompanha a API.
Chega de papo, aí está o link:
Lembrando, que como ela é escrita sob os padrões do .NET STANDARD 2, você poderá usa-la no Xamarin, Mono e etc.
Um abraço!