Demande d'API WaitingForActivation “Pas encore calculé” erreur
Je suis en utilisant le Poloniex C# code de l'API à partir de: https://github.com/Jojatekok/PoloniexApi.Net
Sur ma console application de la demande pour obtenir des soldes de travail, je fais l'appel d'API et les soldes de revenir, mais sur mon application Windows Forms, c'est de ne pas aller au-delà d'attente pour les soldes:
Id = 14, Status = WaitingForActivation, Method = "{null}", Result = "{Not yet computed}"
lors de l'utilisation de ce code:
PoloniexClient polo_client { get; set; }
private void Main(){
polo_client = new PoloniexClient(ApiKeys.PublicKey, ApiKeys.PrivateKey);
var balance_task = getLatestWalletAmounts();
balance_task.Wait();
//doesn't get past here on my Forms app
if (balance_task.IsCompleted){
//gets to here on my Console app
}
}
//get wallet and startup amounts
async Task<IDictionary<string, Jojatekok.PoloniexAPI.WalletTools.IBalance>> getLatestWalletAmounts()
{
//get wallet coin list
return await polo_client.Wallet.GetBalancesAsync();
}
C'est exactement le même code que mon application Console, mais sur les Formulaires d'application, la tâche n'est pas complète et sur l'application de Console c'est terminer et je suis de retour:
Id = 3, Status = RanToCompletion, Method = "{null}", Result = "System.Collections.Generic.Dictionary`2[System.String,Jojatekok.PoloniexAPI.WalletTools.IBalance]"
Des indices quant à pourquoi la même demande n'est pas de remplir sur les Formulaires de mon application, mais il est sur ma Console application? Je suis en utilisant exactement les mêmes Poloniex projet C# référencées dans ma Console et les Formulaires d'application pour interagir avec l'API.
L'API clé publique est le même dans les deux projets, et de l'API clé privée est la même dans les deux projets.
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas mélanger asynchrone et synchrone code comme celui-ci. En appelant
.Wait
, le thread d'INTERFACE utilisateur est bloqué en attente de la fin de la tâche, mais la tâche est essentiellement essaie à "Invoquer" sur le thread de l'INTERFACE utilisateur, de sorte qu'il ne peut pas se terminer. Résultat: blocage.Vous pouvez voir plus d'informations sur le problème de base ici.
Une option, comme un band-aid, est d'utiliser
ConfigureAwait(false)
sur leawait polo_client.Wallet.GetBalancesAsync()
appel; qui va remplacer le comportement par défaut d'essayer de revenir au thread de l'INTERFACE utilisateur.J'ai écrit une pièce plus longue ici au sujet de mettre async code dans le noyau d'une application d'INTERFACE utilisateur.
Cela ressemble à un classique
async
-attendre
blocage: vous avez unSynchronizationContext
, vousawait
en elle (ce qui signifie la poursuite est prévue pour queSynchronizationContext
) et puis vous blocSynchronizationContext
en appelantWait()
, ce qui conduit à une impasse.La bonne solution pour ne pas bloquer sur
async
code, votreMain
devrait être unasync
méthode qui retourne unTask
etawait
sbalance_task
. Une autre option est d'utiliserConfigureAwait(false)
dansgetLatestWalletAmounts()
(et tous les autres "bibliothèque" méthode qui utiliseawait
).