这是我正在使用的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;
我同时调用了这两种方法,但是async方法的状态为 WaitingForActivation ,而Sync方法的时间却过多,无法获得响应。
我将这两种方法称为
var timeResponseAsync = publicRestClient.Time(); //For Async
var timeResponseSync1 = publicRestClient.TimeSync(); // For Sync
答案 0 :(得分:2)
您正在锁定UI线程。
我的猜测是,您正在调用TimeSync()
,然后调用Task.Result
,这会阻塞UI线程,直到从Task
返回的Time()
为止。
由于您在await
内有一个Time()
,它在UI线程上启动,因此一旦请求完成,异步回调将安排在UI线程上发生,但是此UI线程已被阻止等待Task.Result
。因此,您处于僵局。
您能说明一下如何使用TimeSync
以及为什么要使用Sync
方法,然后再使用async
方法。要对其进行正确修复,您需要使呼叫链中的所有组件保持异步状态并等待结果!
您可以尝试做一个补丁修复(此补丁可能有效或无效,最好的情况是它在通话期间仍会阻止UI):
public TimeResponse TimeSync() => Task.Factory.StartNew(() => Time()).Result;