Binance API调用可以在控制台应用程序上正常运行,但不能在WinForm c#上运行

时间:2018-08-21 07:47:27

标签: c# winforms asynchronous async-await synchronization

这是我正在使用的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

1 个答案:

答案 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;