API请求WaitingForActivation“尚未计算”错误

时间:2016-05-10 04:44:02

标签: c# async-await

我正在使用来自https://github.com/Jojatekok/PoloniexApi.Net

的Poloniex C#API代码

在我的控制台应用程序上,获取余额的请求正在运行,我进行API调用并返回余额,但在我的Windows窗体应用程序上,它没有等待余额:

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

使用此代码时:

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

这与我的控制台应用程序完全相同,但是在Forms应用程序上,任务没有完成,而且在控制台应用程序上它正在完成,我正在回来:

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

有关为什么同一请求未在我的Forms应用程序上完成但是它在我的控制台应用程序上的任何提示?我正在使用我的控制台和表单应用程序中引用的完全相同的Poloniex C#项目来与API进行交互。

两个项目中的API公钥相同,两个项目中的API私钥相同。

2 个答案:

答案 0 :(得分:7)

你不能像这样混合异步和同步代码。通过调用position:absolute; margin: auto; max-width: 100%; max-height: 100%; ,UI线程等待任务完成,但任务基本上是尝试&#34;调用&#34;在UI线程上,所以它无法完成。结果:死锁。

You can see more information about the basic problem here.

作为创可贴的一个选项是在.Wait电话上使用ConfigureAwait(false);这将覆盖尝试返回UI线程的默认行为。

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

答案 1 :(得分:2)

这看起来像一个经典的async-await deadlock:你有一个SynchronizationContext,你await(这意味着延续被安排到SynchronizationContext)然后你阻止通过调用SynchronizationContextWait(),这会导致死锁。

不阻止async代码的正确解决方案,您的Main应为async方法,返回Taskawait s {{1 }}。另一种选择是在balance_task(以及使用ConfigureAwait(false)的任何其他&#34;库&#34;方法)中使用getLatestWalletAmounts()