2016-05-10 14 views
1

ich aus dem Poloniex C# API-Code bin mit: https://github.com/Jojatekok/PoloniexApi.NetAPI-Anfrage WaitingForActivation „Noch nicht berechnet“ Fehler

Auf meiner Konsolenanwendung die Anforderung Salden zu bekommen funktioniert, mache ich den API-Aufruf und die Salden kommen zurück , aber auf meinem Windows-Forms-Anwendung ist es nicht vorbei für die Salden warten immer:

Id = 14, Status = WaitingForActivation, Method = "{null}", Result = "{Not yet computed}" 

wenn sie diesen Code verwenden:

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(); 
} 

es ist genau s ame-Code als meine Konsole-Anwendung, sondern auf der Forms-Anwendung die Aufgabe nicht abgeschlossen wird und auf der Konsole-Anwendung ist abgeschlossen, und ich bin immer wieder:

Id = 3, Status = RanToCompletion, Method = "{null}", Result = "System.Collections.Generic.Dictionary`2[System.String,Jojatekok.PoloniexAPI.WalletTools.IBalance]" 

Irgendwelche Hinweise, warum die gleiche Anfrage nicht Ausfüllen in meiner Forms-Anwendung, aber es ist in meiner Konsole App? Ich verwende genau das gleiche Poloniex C# -Projekt, auf das in meiner Console und Forms-App verwiesen wird, um mit der API zu interagieren.

Der öffentliche API-Schlüssel ist in beiden Projekten identisch und der private API-Schlüssel ist in beiden Projekten identisch.

Antwort

4

Sie können asynchronen und synchronen Code nicht so mischen. Wenn Sie .Wait aufrufen, bleibt der UI-Thread hängen und wartet auf den Abschluss der Aufgabe, aber die Aufgabe versucht im Wesentlichen, auf dem UI-Thread "aufzurufen", sodass sie nicht beendet werden kann. Ergebnis: Deadlock.

You can see more information about the basic problem here.

Eine Option, als Band-Aid ist ConfigureAwait(false) auf dem await polo_client.Wallet.GetBalancesAsync() Aufruf zu verwenden; Dadurch wird das Standardverhalten beim Versuch, zum UI-Thread zurückzukehren, überschrieben.

I have written a longer piece here about bringing async code into the core of a UI application.

+0

Ahhh deshalb funktioniert es auf meiner Konsolenanwendung? Weil es keine UI hat ... das macht Sinn. – Nickmccomb

+0

ConfigureAwait (falsch) hat perfekt funktioniert – Nickmccomb

2

Das sieht wie ein klassisches async-await deadlock: Sie SynchronizationContext haben, Sie await drin (was bedeutet, dass die Fortsetzung dieser SynchronizationContext geplant ist) und dann sperren Sie, dass SynchronizationContext durch Wait() Aufruf, der in eine Sackgasse führt .

Die richtige Lösung nicht blockieren auf async Code, Ihre Main sollte ein async Methode sein, die eine Task und await s balance_task zurückgibt. Eine weitere Option ist die Verwendung von ConfigureAwait(false) in getLatestWalletAmounts() (und jeder anderen "Bibliotheks" -Methode, die await verwendet).

+0

ConfigureAwait (falsch) funktioniert, danke für Ihre Antwort – Nickmccomb

Verwandte Themen