c# - Binance API 调用在控制台应用程序上运行良好,但在 WinForm c# 上运行良好
问题描述
这是我正在使用的 Github 存储库 https://github.com/ilkerulutas/BinanceSdk
该代码在控制台应用程序上运行良好,但在 Windows 窗体应用程序中获得响应需要太多时间。
//Async Method
public async Task<TimeResponse> Time()
{
return await SendRequest<TimeResponse>("time", ApiVersion.Version1, ApiMethodType.None, HttpMethod.Get);
}
//Sync Method
public TimeResponse TimeSync() => Time().Result;
我同时调用了这两个方法,但是异步方法给出了状态WaitingForActivation并且同步方法花费了太多时间来获得响应。
我将这两种方法称为
var timeResponseAsync = publicRestClient.Time(); //For Async
var timeResponseSync1 = publicRestClient.TimeSync(); // For Sync
解决方案
你正在死锁你的 UI 线程。
我的猜测是您正在调用TimeSync()
which 然后调用 a Task.Result
,这会阻塞 UI 线程,直到Task
返回 fromTime()
完成。
由于您有一个在 UI 线程上启动的await
内部Time()
,因此请求完成后的异步回调将安排在 UI 线程上发生,但是该 UI 线程已经被等待Task.Result
. 因此,您处于僵局。
您能否展示一下您是如何使用TimeSync
的以及为什么要使用一种Sync
方法,然后再使用一种async
方法。要正确修复它,您需要使调用链中的所有内容异步并等待结果!
您可以尝试的一个补丁修复是(这可能会或可能不会起作用,最好的情况是它仍然会在通话期间阻止 UI):
public TimeResponse TimeSync() => Task.Factory.StartNew(() => Time()).Result;
推荐阅读
- python - 使用给定数量的元素计算列表中的元素
- python - 招摇:python请求:javax.ws.rs.NotAllowedException:HTTP 405方法不允许
- mysql - 为什么将数字插入没有 ' ' 但字符串文本没有的 VARCHAR 列?
- javascript - 如何在不调用渲染函数的情况下访问 Context 的值?
- nativescript - Nativescript 构建到设备
- stripe-payments - 使用特定发票项目创建条带发票,不包括待处理发票项目
- java - 填充数组列表java
- java - 如何映射 Java HashMap
变量名到打字稿 - assembly - 写入 EBX 寄存器最终导致程序分段错误
- angular - 两个数组。如果第一个数组对象值中的一个为真,那么第二个数组将显示一些对象,如果它为假,则显示另一个对象