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:
GitHub – HerbertLausmann/HL.YahooCurrency: .NET C# Multiplatform wrapper for Yahoo Currency Web Service. Convert between over 100 different currencies.
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!