0

Есть некая библиотека которая вызывает все методы в фоновом режиме, но я хочу ее переделать так вызовы, чтобы можно было дождаться результата, потом дальше идти. Но не получается. Помогите кто чем сможет)

Вот код WinForm

private void ConnectExmo_Click(object sender, EventArgs e)
    {
        binanceApi = new BinanceConnector("key", "secretkey");
        binanceApi.Connect();

        binanceApi.refreshTimeServer();                          } 

вот отрывок самого класса:

        public async Task<ServerTimeResponse> GetServerTime()
    {

        var response = await binanceClient.GetServerTime(); //после вызова 
//этой процедуры, все встает колом хотя я ожидаю что смогу получить responce

        return response;

    }

    public override void refreshTimeServer()
    {

        ServerTimeResponse serverTimeBinance = GetServerTime().Result;

    }
  • 1
    static void Main -> static async Task Main и перед client.GetServerTimeAsync(); ставьте await. – EvgeniyZ Apr 14 '20 at 14:49
  • @EvgeniyZ а чего не ответом? – tym32167 Apr 14 '20 at 15:09
  • @tym32167 Лень расписывать. Можете ответить, я не против) – EvgeniyZ Apr 14 '20 at 15:11
  • @EvgeniyZ вам лень, а мне некогда :D – tym32167 Apr 14 '20 at 15:18
  • @tym32167 Вот и у меня +- также, если не дадут ответ, может распишу как будет время, сейчас максимум могу дать коммент. – EvgeniyZ Apr 14 '20 at 15:22
  • Для этого ответа нужно еще как минимум указывать, с какой версии появилась возможность добавить асинхронный Main, а потом рассказывать, а чего же делать, если версия ниже требуемой. – Dzianis Karpuk Apr 14 '20 at 15:28
  • @DzianisKarpuk Если у вас есть желание - удачи, я не против, ибо это лучший вариант как по мне. – EvgeniyZ Apr 14 '20 at 15:40
  • В чем принципиальное отличие изменений? Все то же самое - надо добавить await перед асинхронным вызовом и поменять тип возвращаемого значения с void на Task – Grundy Apr 15 '20 at 09:40
  • до этого было под консоль, сейчас под winform. и там и там не работает. хочу чтобы помогли, что я делаю не так? – Алексей Семёнов Apr 15 '20 at 09:43
  • Не следуешь совету :) в первом комментарии тебе написали что на что надо заменить - тут, то же самое. меняешь void на Task, добавляешь await перед вызовом асинхронной функции .Result не нуден – Grundy Apr 15 '20 at 10:25
  • не могу я в методе main ставить await. Так как я вызываю метод абстрактного класса Connector, и мой объект не всегда реализуется как асинхронный. Есть реализации без async. (к примеру new BinanceConnector можно так вызвать а new ExmoConnector нет)Как мне тогда различать? – Алексей Семёнов Apr 15 '20 at 10:43
  • 1
    где у тебя в коде метод main? Что значит объект не всегда реализуется как асинхронный? Заметь, что из-за того, что ты постоянно что-то недоговариваешь тебе кажется, что уже несколько ответов не подходят. – Grundy Apr 15 '20 at 11:03

1 Answers1

0
public static void Main(string[] args)
{
    var client = new BinanceClient(new ClientConfiguration()
    {
        ApiKey = "некий ключ",
        SecretKey = "некий secret ключ"
    });
    var task = client.GetServerTimeAsync();
    task.Wait(); //результат будет в task.Result
 }
  • После того как я вызываю wait() то все зависает. с чем может быть связано. (Если тот же метод при помощи await то данные получает. т.е. дело явно в Task) – Алексей Семёнов Apr 14 '20 at 15:26
  • @АлексейСемёнов Wait заставляет ждать окончания выполнения таски. Вам вроде это нужно. Если нет, объясните, какого именно поведения вы ожидаете. – Dzianis Karpuk Apr 14 '20 at 15:36
  • Зависает, потому что возникает дедлок. task.Wait(); использовать очень нежелательно. Попробуйте, может и не поможет: var time = client.GetServerTimeAsync().ConfigureAwait(false).GetAwaiter().GetResult(); – vusaldev Apr 14 '20 at 21:50
  • @vusaldev какой еще дедлок, вы точно в курсе что это? – Dzianis Karpuk Apr 15 '20 at 00:51
  • А вы? https://blog.stephencleary.com/2012/07/dont-block-on-async-code.html – vusaldev Apr 15 '20 at 01:36
  • @vusaldev ну так вы внимательно прочтите его, у нас тут консолька, если вы не заметили – Dzianis Karpuk Apr 15 '20 at 01:43
  • только хотел написать, что в консоли отрабатывает норм. Но как переношу на Winform то зависает. про зависания комментарий - относился к WinForm, не думал что имеет значение – Алексей Семёнов Apr 15 '20 at 06:56
  • client.GetServerTimeAsync().ConfigureAwait(false).GetAwaiter().GetResult(); не помогает – Алексей Семёнов Apr 15 '20 at 07:02
  • @АлексейСемёнов на WinForm такие танцы с бубном вообще ни к чему. в частности, там не будет "почему то он проскакивает все это и завершает программу, не дождавшись". опишите, какую вы задачу пытаетесь решить, но если это WinForm, то и пример дайте с WinForm. – Dzianis Karpuk Apr 15 '20 at 08:13
  • public ServerTimeResponse GetServerTime() {
            var response = binanceClient.GetServerTime();
    
            return response.Result;
    
        }
    

    Где [AsyncStateMachine(typeof(d__14))] public Task GetServerTime(); В итоге не могу корректно получить результат

    – Алексей Семёнов Apr 15 '20 at 08:50
  • @АлексейСемёнов отредактируйте вопрос. уберите консольный код, покажите, в чем ваша проблема с WinForm. конкретно по этому коду, просто делаете public async Task GetServerTime() { var response = await binanceClient.GetServerTime(); return response; } и... видимо, вы не знаете, что с этим дальше делать, значит, проблема не здесь. – Dzianis Karpuk Apr 15 '20 at 09:18
  • вроде оформил. Старался чтобы было понятно. – Алексей Семёнов Apr 15 '20 at 09:35