首页 > 解决方案 > 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

标签: c#winformsasynchronousasync-awaitsynchronization

解决方案


你正在死锁你的 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;

推荐阅读