С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
11 / 11 / 7
Регистрация: 23.12.2015
Сообщений: 950

Программа не дожидается, пока выполнится асинхронный метод

09.08.2018, 23:36. Показов 2371. Ответов 5

Студворк — интернет-сервис помощи студентам
У меня есть два метода:
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
        public async static Task Challenge() //Авторизация в системе
        {
            string accessKey = "...";
 
            //Здесь получаем токен
            var responseString = await "https://vtiger.com/webservice.php?operation=getchallenge&username=username".GetStringAsync();
            tokenString = responseString.Substring(35, 13);
 
            //Шифруем токен и ключ доступа с помощью мд5
            md5String = MD5Hash(tokenString + accessKey);
 
            CRMAuth();
        }
 
        public async static void CRMAuth()
        {
            //Авторизуемся
            var responseString = await "https://vtiger.com/webservice.php"
            .PostUrlEncodedAsync(new { operation = "login", username = "username", accessKey = md5String })
            .ReceiveString();
 
            //ID сессии
            sessionID = responseString.Substring(41, 21);
        }
Эти методы вызываются из другого статического асинхронного метода:
C#
1
2
3
4
public async static void InsertOperation(Order order, Client client, bool result)
{
       Challenge();
}
Но как только дело доходит до строки var responseString = await "https://vtiger.com/webservice.php?operation=getchallenge&username=username".GetStringAsync(); в методе Challenge(), выполнение метода тут же прерывается, соответственно, метод CRMAuth() не выполняется и я получаю ошибку из-за того, что не авторизовался.
Как справиться с этой проблемой?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.08.2018, 23:36
Ответы с готовыми решениями:

Не удается выполнить метод Click, пока не выполнится определенная процедура
Как сделать так, чтобы метод Click вызывался независимо от всего? У меня есть метод Клик, который останавливает таймер. Есть функция...

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

Напечатайте в столбец числа, пока не выполнится условие
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <locale.h> int main() { setlocale(LC_ALL,...

5
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18252 / 14177 / 5366
Регистрация: 17.03.2014
Сообщений: 28,863
Записей в блоге: 1
10.08.2018, 00:08
Лучший ответ Сообщение было отмечено DenKG как решение

Решение

DenKG, нужно добавить await к вызову Challenge
C#
1
2
3
4
public async static void InsertOperation(Order order, Client client, bool result)
{
       await Challenge();
}
2
11 / 11 / 7
Регистрация: 23.12.2015
Сообщений: 950
10.08.2018, 00:20  [ТС]
OwenGlendower, теперь метод CRMAuth() не до конца выполняется. И также вылетает на строке var responseString = await "https://vtiger.com/webservice.php"
.PostUrlEncodedAsync(new { operation = "login", username = "username", accessKey = md5String })
.ReceiveString();


Добавлено через 6 минут
А, понял. То есть и к вызову CRMAuth() нужно было добавить await и вместо void использовать Task
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18252 / 14177 / 5366
Регистрация: 17.03.2014
Сообщений: 28,863
Записей в блоге: 1
10.08.2018, 00:22
DenKG, то что там тоже нужно добавить await так сложно догадаться?

Что более важно (на что я сразу не обратил внимание) так это async void метод. Так делать не надо. Следует использовать Task или Task<T> в качестве типа возврата. В данном случае sessionID лучше вернуть как результат значит Task<string>
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
        public async static Task Challenge() //Авторизация в системе
        {
            string accessKey = "...";
 
            //Здесь получаем токен
            var responseString = await "https://vtiger.com/webservice.php?operation=getchallenge&username=username".GetStringAsync();
            tokenString = responseString.Substring(35, 13);
 
            //Шифруем токен и ключ доступа с помощью мд5
            md5String = MD5Hash(tokenString + accessKey);
 
            sessionID = await CRMAuth();
        }
 
        public async static Task<string> CRMAuth()
        {
            //Авторизуемся
            var responseString = await "https://vtiger.com/webservice.php"
            .PostUrlEncodedAsync(new { operation = "login", username = "username", accessKey = md5String })
            .ReceiveString();
 
            //ID сессии
            return responseString.Substring(41, 21);
        }
Цитата Сообщение от DenKG Посмотреть сообщение
И также вылетает на строке
Текст исключения?
0
11 / 11 / 7
Регистрация: 23.12.2015
Сообщений: 950
10.08.2018, 00:24  [ТС]
OwenGlendower, нет, нет. Всё хорошо) Я уже догадался.
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Текст исключения?
Я имел ввиду, что после этой строки не выполняется присваивание, а сразу идет переход в другой метод, из которого был вызван Chellenge()
0
Эксперт .NET
 Аватар для Usaga
14121 / 9338 / 1350
Регистрация: 21.01.2016
Сообщений: 35,079
10.08.2018, 08:10
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Что более важно (на что я сразу не обратил внимание) так это async void метод. Так делать не надо. Следует использовать Task или Task<T> в качестве типа возврата.
async void и async Task - разные вещи. Они не заменяют друг друга. async void является точкой входа в цепочку асинхронных вызовов и выбрасывает наружу возникающие в этих методах исключения. async Task без await никакие исключения не выбросит и отработает как будто бы нормально!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.08.2018, 08:10
Помогаю со студенческими работами здесь

Как приостановить функцию пока не выполнится ajax запрос?
function () { arr.forEach(function(item, i, arr) { $.ajax({...}) // продолжение функции, выполнить после...

Зациклить код, до тех пор пока не выполнится условие
Доброго времени суток. Есть код. P простое генерируется исходя из уравнения P=2*Q+1 Функция isPrime проверяет P на простоту. Вопрос:...

Сколько раз выполнится тело цикла во фрагменте алгоритма: q:=27; p:=36; нц пока (div(q,5)iv(p,7)) q:=q+2; p:+3
помогите решить пожалуйста

Увеличение значения переменной на единицу всякий раз, пока не выполнится условие
привет нужно чтобы к числу постоянно +1 пока не выполнится условие но моя прога=рама просто делает +1 и все private void...

Выполнить суммирование членов бесконечного ряда до тех пор, пока не выполнится условие
1 Выполнить суммирования членов бесконечного ряда до тех пор, пока последний член ряда по абсолютному значению не будет меньше абсолютной...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru