API请求WaitingForActivation“尚未计算”错误
我使用的是Poloniex C#API代码: https : //github.com/Jojatekok/PoloniexApi.Net
在我的控制台应用程序上获取余额的请求正在运行,我进行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> 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私钥相同。
你不能像这样混合异步和同步代码。 通过调用.Wait
,UI线程等待任务完成,但该任务基本上是尝试在UI线程上“调用”,因此无法完成。 结果:死锁。
您可以在此处查看有关基本问题的更多信息。
作为创可贴的一个选择是在await polo_client.Wallet.GetBalancesAsync()
调用上使用ConfigureAwait(false)
; 这将覆盖尝试返回UI线程的默认行为。
我在这里写了一篇关于将异步代码引入UI应用程序核心的更长篇幅。
这看起来像是经典的async
– await
死锁 :你有一个SynchronizationContext
,你await
它(这意味着继续被安排到SynchronizationContext
),然后通过调用Wait()
阻止该SynchronizationContext
,这会导致死锁。
不阻止async
代码的正确解决方案,您的Main
应该是一个async
方法,它返回一个Task
并await
s balance_task
。 另一种选择是在getLatestWalletAmounts()
(以及使用await
任何其他“库”方法ConfigureAwait(false)
中使用ConfigureAwait(false)
)。