Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923

Асинхронная задача Result = "{Not yet completed}"

22.01.2021, 12:00. Показов 5604. Ответов 53
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Стараюсь получить баланс пользователя через асинхронный метод BalanseNowAsync через запрос по RestAPI.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        private string BalanseNow()
        {
            Response<ClientAccount[]> response;
            try
            {
                response = service.GetClientAccounts(FindedClient.id.ToString()); //точка останова тут
            }
            catch (Exception ex)
            {
                throw new ArgumentException(ex.Message);
            }
            //в return возвращается баланс из всей кучи не нужной для метода информации. 
            return (new List<ClientAccount>(response.Data).Find(x => x.account_id == SelectedAccount.account_id)).summ;
        }
        public async Task<string> BalanseNowAsync() => await Task.Factory.StartNew(BalanseNow);
Если делать без асинхронна, то всё работает, но как только мои пальцы стараются слова async, получаю следующее:

после момента с точной остановы перекидывает обратно в класс, вызывающий метод, а результат метода
Id = 1965, Status = WaitingForActivation, Method = "{null}", Result = "{Not yet computed}"
Дальше пойдёт не особо нужная информация, но если кому интересно, то сам метод, из API, выглядит следующим образом

C#
1
2
3
4
5
        public Response<ClientAccount[]> GetClientAccounts(string clientID) 
        {
            //не важная информация
            return response;
        }
И структура класс Response
C#
1
2
3
4
5
6
7
8
    public class Response<T>
    {
        public bool Success { get; set; }
        public string Error { get; set; }
        public bool SessionExpired { get; set; }
        public T Data { get; set; }
        public long Total { get; set; }
    }
То есть Response, это что-то а-ля Task, как я считаю, выглядит более функциональней.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.01.2021, 12:00
Ответы с готовыми решениями:

Build completed with a result of 'Failed' при билде на Андроид
Сделал проект и уже собирался билдить, но в конце загрузки высветилось 4 сообщения:

Чем отличаются синхронная и асинхронная задача?
Чем отличаются синхронная и асинхронная задача?

underflow during read from stream minor code: 0 completed: No minor code: 0 completed: No
Сначала делаю 1) String testString = orb.object_to_string(obj); PreparedStatement pstmt = conn.prepareStatement('INSERT INTO...

53
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
22.01.2021, 23:48  [ТС]
Студворк — интернет-сервис помощи студентам
OwenGlendower, у меня, сейчас, проекта "под рукой" нет, но я попытаюсь по памяти написать как там всё.

Model
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
        private string BalanseNow()
        {
            Response<ClientAccount[]> response;
            try
            {
                response = service.GetClientAccounts(FindedClient.id.ToString()); //точка останова тут
            }
            catch (Exception ex)
            {
                throw new ArgumentException(ex.Message);
            }
            //в return возвращается баланс из всей кучи не нужной для метода информации. 
            return (new List<ClientAccount>(response.Data).Find(x => x.account_id == SelectedAccount.account_id)).summ;
        }
        public async Task<string> BalanseNowAsync()
        {
            var result = await Task.Run(() => BalanseNow());
            RaiseBalanceAction(BalanceStateEnum.Changed, result);//событие изменения баланса.
            retunt result ;
        }
 
 
        private decimal DepositPay(decimal newSumm){ /*  ...  */  }
 
        public async Task<bool> DepositPayAsync(decimal newSumm)
        {
            bool result = false;
            try
            {
                result  = await Task.Run(() => DepositPay(newSumm));
            }
            catch(Exception ex)
            {
                throw new ArgumentAxception(ex.Message);
            }
        }
*Пользователь вставляет купюру, в купюроприёмник и нажимает "Оплатить"*.
ViewModel
C#
1
2
3
4
5
6
7
8
private async void DepositPay()
{
    // оплата депозита
    decimal newSumm = 5m;
    await moldel.DepositPayAsync(newSumm);
    await moldel.BalanseNowAsync();
    //Выдать чек
}
По-моему я так написал, но это совсем не точно.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18417 / 14348 / 5371
Регистрация: 17.03.2014
Сообщений: 29,033
Записей в блоге: 1
22.01.2021, 23:48
Цитата Сообщение от limeniye Посмотреть сообщение
В итоге наотхватывался я ошибок -- достаточно.
Нежелание вновь наступать на грабли понятно. Однако то что вам пытаются донести что никаких граблей тут нет. Нужно просто напросто сделать все цепочку асинхронной снизу доверху. Начинаем с GetClientAccounts. Меняем имя на GetClientAccountsAsync (только в месте объявления, см.ниже). Меняем у него тип возвращаемого значения на Task<Response<ClientAccount[]>>, добавляем модификатор async и вызываем с await _requestSender.SendWebRequestAsync.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        public async Task<Response<ClientAccount[]>> GetClientAccountsAsync(string clientID)
        {
            var jObject = new JObject
            {
                ["client_id"] = clientID
            };
 
            string json = JsonConvert.SerializeObject(jObject);
 
            json = HttpUtility.UrlEncode(json);
 
            string url = $"{_url}/client_accounts?params={json}";
 
            var response = await _requestSender.SendWebRequestAsync<Response<ClientAccount[]>, object>(url, HttpMethod.Get, null);
            return response;
        }
Теперь из переименования GetClientAccounts в GetClientAccountsAsync код перестанет компилироваться и значит мы не забудем исправить все места вызова. В которых мы повторяем шаги - переименовать метод, добавить async, изменить возврашаемый тип на Task<T>, *Async метод вызываем с await.

В итоге получаем правильный код для работы с API. Не забудьте поделиться результатом с тем кто дал вам код чтобы он тоже взял это на вооружение.
1
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
22.01.2021, 23:53  [ТС]
писал "от руки", могут быть синтаксический ошибки

Добавлено через 5 минут
Цитата Сообщение от OwenGlendower Посмотреть сообщение
все цепочку асинхронной снизу доверху
да! У меня так сейчас в том проекте. Но я наоборот думал что то какой-то костыль, а по другому у меня просто не компилировалось. Система "антидурака" сделала своё дело правильно)
Теперь я понимаю, что нужно вести до последнего. Моё представление про асинхронный метод, до этой темы, было вообще другое.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18417 / 14348 / 5371
Регистрация: 17.03.2014
Сообщений: 29,033
Записей в блоге: 1
22.01.2021, 23:55
Цитата Сообщение от limeniye Посмотреть сообщение
у меня, сейчас, проекта "под рукой" нет, но я попытаюсь по памяти написать как там всё.
Лучше выложите настоящий код. Лично я никуда не спешу.
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
22.01.2021, 23:56  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
код перестанет компилироваться и значит мы не забудем исправить все места вызова

Ого как Вы доступно всё и в подробностях описываете. Очень приятно, что Вы уделяете мне столько времени.
Я Вам за это очень сильно благодарен!
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18417 / 14348 / 5371
Регистрация: 17.03.2014
Сообщений: 29,033
Записей в блоге: 1
22.01.2021, 23:56
Цитата Сообщение от limeniye Посмотреть сообщение
да! У меня так сейчас в том проекте.
Не заметно. Особенно async void мне "нравится". И постоянные Task.Run.
1
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
23.01.2021, 00:04  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
изменить возврашаемый тип на Task<T>
а вот тут не понял. Это где?

Добавлено через 6 минут
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Не заметно. Особенно async void мне "нравится". И постоянные Task.Run.
Как я понял Элд Хасп, то void -- это окончательный, туда и дойдёт ошибка, если вся остальная цепочка будет Task. Если у меня ViewModel, то ошибка должна остановиться там. Я собирался сделать событие и поместить в catch'и, которые в задачах в модели. Когда сработает событие ошибки, ошибка, через ex.Message передастся в событие, а в ViewModel, когда "услышит" что в моделе произошло событие ошибки -> осуществит запись в файл.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18417 / 14348 / 5371
Регистрация: 17.03.2014
Сообщений: 29,033
Записей в блоге: 1
23.01.2021, 00:08
Цитата Сообщение от limeniye Посмотреть сообщение
Как я понял Элд Хасп, то void -- это окончательный, туда и дойдёт ошибка
У нет уже нет сил заниматься объяснениями. Выложите весь настоящий код тогда и поговорим предметно.
1
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
23.01.2021, 00:09  [ТС]
OwenGlendower, Вас понял, ради такого завтра на работу смотаюсь)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
23.01.2021, 14:58
Цитата Сообщение от limeniye Посмотреть сообщение
Я копнул в самый вверх программы. Вы абсолютно правы, он асинхронный
А я у вас интересовался насчёт метода GetClientAccounts....
Вы мне ответили, что это не ваш метод и он синхронный.


Добавлено через 35 минут
Исходя из того, что представлено в теме:

В основе вариант от OwenGlendower:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        // Это, как я понял часть Модели?
 
        // Члены экземпляра не используются - поэтому статический метод.
        public static async Task<Response<ClientAccount[]>> GetClientAccountsAsync(object clientID)
        {
            var jObject = new JObject
            {
                ["client_id"] = clientID.ToString();
            };
 
            string json = JsonConvert.SerializeObject(jObject);
 
            string urlEncode = HttpUtility.UrlEncode(json);
 
            string url = $"{_url}/client_accounts?params={urlEncode}";
 
            var response = await _requestSender.SendWebRequestAsync<Response<ClientAccount[]>, object>(url, HttpMethod.Get, null);
            return response; // Во время отладки здесь можно поставить точку останова и проверить response
        }
C#
1
2
3
4
5
6
7
8
9
10
11
12
        // А это, наверное, VM ?
 
        public static async Task<string> BalanseNowAsync()
        {
            Response<ClientAccount[]> response = await Task.Factory.StartNew(service.GetClientAccountsAsync, FindedClient.id); 
 
            var result = response.Data.Find(x => x.account_id == SelectedAccount.account_id)).summ;
 
            RaiseBalanceAction(BalanceStateEnum.Changed, result); //событие изменения баланса.
 
            retunt result ;
        }
И "запускающий метод":
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private async void DepositPay()
{
    // оплата депозита
    decimal newSumm = 5m;
 
    var taskDeposit = moldel.DepositPayAsync(newSumm);
    await taskDeposit;
    // Проверка состояния завершения taskDeposit 
    if(taskDeposit.Status == ...)
    {
         --------------
     }
 
    var taskBalanse = moldel.BalanseNowAsync();
    await taskBalanse;
    // Проверка состояния завершения taskBalanse
    if(taskBalanse.Status == ...)
    {
         --------------
     }
 
    //Выдать чек
}
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
23.01.2021, 16:52  [ТС]
Элд Хасп, так он синхронный. В нём вызывается асинхронный метод, но без await. Я думаю это не делает его асинхронным. Но я не уверен.

Добавлено через 6 минут
Элд Хасп, ой, чтт я сказал? Забыли ))
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
23.01.2021, 17:18
Цитата Сообщение от limeniye Посмотреть сообщение
так он синхронный. В нём вызывается асинхронный метод, но без await.
C#
14
15
            var response = _requestSender.SendWebRequest<Response<ClientAccount[]>, object>(url, HttpMethod.Get, null);
            return response;
Метод _requestSender.SendWebRequest, что возвращает?
Задачу (task) и результат?

Добавлено через 1 минуту
И в Api есть метод _requestSender.SendWebRequestAsync(...) ?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18417 / 14348 / 5371
Регистрация: 17.03.2014
Сообщений: 29,033
Записей в блоге: 1
23.01.2021, 19:03
Цитата Сообщение от Элд Хасп Посмотреть сообщение
C#
1
            Response<ClientAccount[]> response = await Task.Factory.StartNew(service.GetClientAccountsAsync, FindedClient.id);
Зачем тут Task.Factory.StartNew? Почему не используется await?

Цитата Сообщение от Элд Хасп Посмотреть сообщение
C#
1
2
3
4
5
    await taskDeposit;
    // Проверка состояния завершения taskDeposit
    ...
    // Проверка состояния завершения taskBalanse
    if(taskBalanse.Status == ...)
В чем смысл проверок статуса задачи?

Цитата Сообщение от Элд Хасп Посмотреть сообщение
async void
Это зло в чистом виде. Следует заменить на async Task.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
// Члены экземпляра не используются - поэтому статический метод.
Спорно. Сегодня не используются, завтра используюются. А ведь изменение статический <-> экземплярный для public членов это breaking change влияющий на использование члена. Плюс мокать такие методы тяжелее. Я бы убрал static.

Добавлено через 29 секунд
Цитата Сообщение от Элд Хасп Посмотреть сообщение
И в Api есть метод _requestSender.SendWebRequestAsync(...) ?
ТС обещал выложить исходники. Ждемс ...
2
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
23.01.2021, 19:25
И в Api есть метод _requestSender.SendWebRequestAsync(...) ?
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Почему не используется await?
Опечатка.
Перепутал с GetClientAccounts.
Я так и не понял есть или нет в API GetClientAccountsAsync(...)?

Добавлено через 1 минуту
Цитата Сообщение от OwenGlendower Посмотреть сообщение
В чем смысл проверок статуса задачи?
Где должны обрабатываться исключения?

Добавлено через 11 минут
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Это зло в чистом виде. Следует заменить на async Task.
Ну, смотрите:
У нас метод команды по любому void.
Он может быть синхронным или асинхронным.
Но всё равно будет какой-то первый вызов асинхронного метода из синхронного.
Вот этот первый вызов кому будет возвращать задачу?

Пример пвсевдокода:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public bool IsInCorrect {get; private set;}
public string MessageErrror {get; private set;}
public RelayCommand MyCommand {get;} = new RelayCommand(MyMethodAsync);
 
// Этот метод может быть только void.
private async void MyMethodAsync()
{
     var task = model.MethodAsync();
 
     await task;
 
     if (task.Status ==TaskStatus.Faulted)
    {
          IsInCorrect = true;
          MessageErrror = "MethodAsync завершился исключением";
     }
}
Возможно я что-то неверно понимаю.
Как по вашему лучше сделать?

Добавлено через 3 минуты
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Спорно. ... Я бы убрал static.
Вы правы.
Я не подумал, что для соединения по любому нужны какие-то данные сохраняемые от вызова к вызову.
Сейчас посмотрел внимательнее, и увидел переменную (поле) _url.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18417 / 14348 / 5371
Регистрация: 17.03.2014
Сообщений: 29,033
Записей в блоге: 1
23.01.2021, 21:03
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Где должны обрабатываться исключения?
Цитата Сообщение от Элд Хасп Посмотреть сообщение
У нас метод команды по любому void.
Я не понял что вы использовали async void из-за команды. Это понятный сценарий, но который все-таки лучше переделать на асихронность - MVVM - Going async with async command + AsyncAwaitBestPractices.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
И в Api есть метод _requestSender.SendWebRequestAsync(...) ?
limeniye, это к вам вопрос.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
23.01.2021, 21:30
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Я не понял что вы использовали async void из-за команды.
Возможно не в этой теме - от limeniye несколько тем.
И это часть его реализации WPF приложения.
Наверное, здесь неполная информация.

НО разве дело только в комманде?
На мой взгляд, всегда есть некий самый верхний асинхронный метод которому некому будет передавать задачу.
И в этом методе, если нужно, должна происходит полная обработка всех состояний задачи.

Добавлено через 2 минуты
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Это понятный сценарий, но который все-таки лучше переделать на асихронность - MVVM - Going async with async command + AsyncAwaitBestPractices.
Ну, так он и переделан.
Просто самостоятельно, без использования библиотечных решений.
Что касается ссылок, AsyncCommand - много разных реализаций (так же как и RelayCommand).
Но не видел (в том числе и в этой), чтобы "не терялись" исключения.
По второй ссылке - пока не читал.
Будет время - ознакомлюсь.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18417 / 14348 / 5371
Регистрация: 17.03.2014
Сообщений: 29,033
Записей в блоге: 1
23.01.2021, 21:31
Цитата Сообщение от Элд Хасп Посмотреть сообщение
На мой взгляд, всегда есть некий самый верхний асинхронный метод которому некому будет передавать задачу.
В GUI приложении да. В веб необязательно.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
И в этом методе, если нужно, должна происходит полная обработка всех состояний задачи.
Что это даст? Если с таской что-то не так, то await строкой выше уже выбросил исключение.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
23.01.2021, 21:44
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Если с таской что-то не так, то await строкой выше уже выбросил исключение.
То есть await надо обернуть в try-catch? Постоянно забываю об этом.... Косяк.
Ведь обработку исключения (и других свойств задачи) надо производить внутри метода MyMethodAsync.
Так как в синхронном, там где идёт первый асинхронный вызов нет ожидания и, соответственно, информация о состоянии задачи будет утеряна.
Какие есть ещё варианты кроме обработки в MyMethodAsync ?

Добавлено через 1 минуту
Цитата Сообщение от OwenGlendower Посмотреть сообщение
В GUI приложении да. В веб необязательно.
До веб пока "руки не дошли".
Буду разбирать когда-нибудь в будушем.
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
25.01.2021, 12:12  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
// Это, как я понял часть Модели?
-- это часть API. API, по сути, это и есть Model. Но я имею ввиду что Model -- это мой проект, а API, это отдельный проект, с запросами.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
// А это, наверное, VM ?
-- а это моя модель

Цитата Сообщение от Элд Хасп Посмотреть сообщение
И "запускающий метод":
-- а это уже VM

___

Цитата Сообщение от OwenGlendower Посмотреть сообщение
ТС обещал выложить исходники. Ждемс ...
писал на выходных свой проект, от рабочего хотел взять паузу.

___

Цитата Сообщение от OwenGlendower Посмотреть сообщение
limeniye, это к вам вопрос.
Я предупредил Элд Хасп, что не игнорирую, а прочту тему позже. Сейчас интенсивно учу OpenGL, после работы и на выходных.


____

Я больше вникнул в проект API. Как я понял, всё что Get -- это СИНХРОННЫЙ метод:
Элд Хасп,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        public Response<ClientAccount[]> GetClientAccounts(string clientID) 
        {
            var jObject = new JObject
            {
                ["client_id"] = clientID
            };
 
            string json = JsonConvert.SerializeObject(jObject);
 
            json = HttpUtility.UrlEncode(json);
 
            string url = $"{_url}/client_accounts?params={json}";
 
            var response = _requestSender.SendWebRequest<Response<ClientAccount[]>, object>(url, HttpMethod.Get, null);
            return response;
        }
_requestSender.SendWebRequest
C#
1
2
3
4
         public TResponse SendWebRequest<TResponse, TRequest>(string url, HttpMethod method, TRequest request) where TRequest : class
                                                                                                              where TResponse : class
        {
        }

А вот Post -- асинхронный
C#
1
2
3
4
5
6
7
8
9
10
11
12
        public async Task<TResponse> SendHttpRequest<TResponse, TRequest>(string url, HttpMethod method, TRequest request) where TRequest : class
                                                                                                                           where TResponse : class
        {
            //..
                var httpResponse = await client.SendAsync(httpRequest);
                if (httpResponse.IsSuccessStatusCode)
                {
                    string json = await httpResponse.Content.ReadAsStringAsync();
                    response = JsonConvert.DeserializeObject<TResponse>(json);
                }
            //..
        }

Все Post методы отправляются таким вот образом
C#
1
2
3
4
5
6
        public Response<Transaction[]> PayDepositReplenishment(Transaction transaction)
        {
            //..
            var response = _requestSender.SendHttpRequest<Response<Transaction[]>, Transaction>($"{_url}/transactions", HttpMethod.Post, transaction).Result;
            return response;
        }
Добавлено через 8 минут
OwenGlendower, Вы спрашивали как выглядит проект на данном этапе(то есть то, что я делал ещё в пятницу аж).


Model

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        private string BalanseNow()
        {
            Response<ClientAccount[]> response;
            try
            {
                response = service.GetClientAccounts(FindedClient.id.ToString());
            }
            catch (Exception ex)
            {
                throw new ArgumentException(ex.Message);
            }
 
            return (new List<ClientAccount>(response.Data).Find(x => x.account_id == SelectedAccount.account_id)).summ;
        }
        public async Task<string> BalanseNowAsync()
        {
            var result = await Task.Run(() => BalanseNow());
                RaiseActionBalance(BalanceEnum.TopUp, Convert.ToDecimal(result));
            return result;
        }
ViewModel
C#
1
2
3
4
5
6
        private async void CurrentPageChanged(/*    */)
        {
        //..
            await model.BalanseNowAsync();
        //..
        }
И когда в Model происходит событие изменение текущего баланса, в VM происходит следующее
C#
1
2
3
4
5
6
7
8
9
        private void ModelActionCurrentBalance(object sender, BalanceEnum action, decimal item)
        {
            switch (action)
            {
                case BalanceEnum.TopUp:
                    CurrentBalance = item.ToString();
                    break;
            }
        }
CurrentBalance -- это баланс, который биндится к View

Добавлено через 5 минут
Касательно исправлений:

C#
1
return response.Data.First(x => x.account_id == SelectedAccount.account_id).summ;
. В первую очередь сделал по нормальному, через Linq.
До этого было ужасное
C#
1
return (new List<ClientAccount>(response.Data).Find(x => x.account_id == SelectedAccount.account_id)).summ;
Добавлено через 1 минуту
Касательно того, чтобы сделать просто await -- метод получения баланса, это Get, а всё что Get, в проекте -- синхронные не Task методы.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18417 / 14348 / 5371
Регистрация: 17.03.2014
Сообщений: 29,033
Записей в блоге: 1
25.01.2021, 12:58
limeniye, покажите полный код SendWebRequest и SendHttpRequest.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.01.2021, 12:58

Асинхронная задача и завершение формы: как сделать верно?
Здравствуйте, уважаемые форумчане. У меня есть форма, которая при инициализации подгружает данные с БД. Естественно, это долго. Поэтому я...

Задача по процедуре add(+List, -Result)
Здравствуйте! Помогите написать задачу по данной процедуре. Условие Создать процедуру add(+List, -Result), генерирующую на базе...

Как string result переобразовать в char result [1024]
Как string переобразовать в char?

Use of undefined constant result - assumed 'result'
Здравствуйте! Создаю свой блог. И вот дело дошло до создания юзеров, а мне выдается ошибка Notice: Use of undefined constant result -...

Warning: mysql_result() [function.mysql-result]: Unable to jump to row 0 on MySQL result index 75 in
Warning: mysql_result() : Unable to jump to row 0 on MySQL result index 75 in Z:\home\amm.su\WWW\modules\icq\index.php on line 27 ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru