129 / 127 / 107
Регистрация: 09.01.2017
Сообщений: 1,651
1

Авторизация в отдельном потоке

27.09.2018, 02:48. Показов 1241. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Авторизируюсь Вк через VKNET:
Кликните здесь для просмотра всего текста
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
CancellationTokenSource mToken = new CancellationTokenSource();
 
var Authorization = Task.Factory.StartNew(o => Authorize((CancellationToken)o), mToken.Token, 
    TaskCreationOptions.LongRunning);
 
try
{
    mToken.Cancel();
    Task.WaitAll(Authorization);
}
catch
{
 
}
 
.......
 
private void Authorize(CancellationToken token)
{
    while (!token.IsCancellationRequested)
    {
        token.WaitHandle.WaitOne(1000);
 
        Program.Account.Authorize(new VkNet.Model.ApiAuthParams
        {
            ApplicationId = Application_id,
            Login = TB_Login.Text,
            Password = TB_Password.Text,
            Settings = VkNet.Enums.Filters.Settings.All
        });
    }            
}


В итоге, поток не запускается вообще. Почему?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.09.2018, 02:48
Ответы с готовыми решениями:

Пикчербокс в отдельном потоке
Добрый день! Подскажите, кто знает, как добавить picturebox в отдельный поток (там будет анимация)...

Класс в отдельном потоке
Всем доброго дня и хорошего настроения! :) Подскажите, у меня есть класс Calculate как его...

Форма в отдельном потоке
Я создал форму, которая будет отображаться во время загрузки приложения (в ней меняется...

Запустить метод в отдельном потоке
Всем доброго времени суток. Столкнулся с такой проблемой, на форму добавил элемент timer1, который...

6
Эксперт .NET
12089 / 8367 / 1280
Регистрация: 21.01.2016
Сообщений: 31,543
27.09.2018, 04:31 2
Zwelenewskiy, вы запускаете задачу и передаёте ей токен, который тут же отменяете. Гораздо эффективнее было бы вообще не запускать задачу, было бы ровно тоже самое, но код был бы проще.
1
129 / 127 / 107
Регистрация: 09.01.2017
Сообщений: 1,651
28.09.2018, 01:10  [ТС] 3
Usaga, использую отдельный поток из-за того,что при авторизации GUI виснет. А это не есть хорошо)
Добавлено через 37 минут
Кликните здесь для просмотра всего текста
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
37
38
Program.Account = new VkApi();
 
    try
    {
        CancellationTokenSource mToken = new CancellationTokenSource();
 
        var Authorization = Task.Factory.StartNew(o => Authorize(TB_Login.Text, TB_Password.Text), mToken.Token, 
            TaskCreationOptions.LongRunning); 
 
        Task.WaitAll(Authorization);
 
        if (Program.Account.Token != null)
        {
            Hide();
            new Form1().ShowDialog();
        }
    }
    catch
    {
        MessageBox.Show("Данные введены неверно");
        return;
    }
 
.......
 
private void Authorize(CancellationToken token)
{
    private void Authorize(string Login, string Password)
    {
        Program.Account.Authorize(new VkNet.Model.ApiAuthParams
        {
            ApplicationId = Application_id,
            Login = Login,                
            Password = Password,
            Settings = VkNet.Enums.Filters.Settings.All
        });
    }     
}


Собственно, рабочий вариант. Убрал управляющий токен

Добавлено через 3 минуты
Теперь GUI "не виснет", спокойно ждет завершения потока авторизации. Но тем не менее, пока он ждет, GUI, все-таки, не отвечает на другие действия, т.е., все-таки, виснет... Можно ли от этого избавиться?
0
Эксперт .NET
12089 / 8367 / 1280
Регистрация: 21.01.2016
Сообщений: 31,543
28.09.2018, 04:19 4
Вы запустили отдельный поток, а в основном стали ожидать его завершения) Это ровно тоже самое, что сделать всё в одном потоке, только кода больше.

Цитата Сообщение от Zwelenewskiy Посмотреть сообщение
Можно ли от этого избавиться?
Не ждать завершения потока?
0
burning1ife
1462 / 1284 / 293
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
29.09.2018, 07:55 5
Используйте метод AuthorizeAsync
А по сути это I/O-bound операция, так что отдельный поток здесь не нужен.

Добавлено через 3 минуты
Я глянул исходники VkNet, у них кстати асинхронность через выделение потока, т.е. через жопу
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static Task<T> TryInvokeMethodAsync<T>(Func<T> func)
        {
            var tcs = new TaskCompletionSource<T>();
 
            Task.Factory.StartNew(() =>
                {
                    try
                    {
                        var result = func.Invoke();
                        tcs.SetResult(result);
                    }
                    catch (VkApiException ex)
                    {
                        tcs.SetException(ex);
                    }
                })
                .ConfigureAwait(false);
 
            return tcs.Task;
        }

C#
1
2
3
4
    public Task AuthorizeAsync(IApiAuthParams @params)
        {
            return TypeHelper.TryInvokeMethodAsync(func: () => Authorize(@params: @params));
        }
По хорошему надо было сделать через async методы HttpClient, как и сделано в https://github.com/worldbeater/VkLibrary , которую я и использую.
1
129 / 127 / 107
Регистрация: 09.01.2017
Сообщений: 1,651
07.10.2018, 01:22  [ТС] 6
Цитата Сообщение от Usaga Посмотреть сообщение
Не ждать завершения потока?
Да, была сделана большая глупость)
0
129 / 127 / 107
Регистрация: 09.01.2017
Сообщений: 1,651
07.11.2018, 02:00  [ТС] 7
Цитата Сообщение от kenny69 Посмотреть сообщение
т.е. через жопу
Как тогда сделать не через жопу?)
0
07.11.2018, 02:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.11.2018, 02:00
Помогаю со студенческими работами здесь

Выполнение метода в отдельном потоке
Добрый %s! Возникла проблема следующего характера: Необходимо выполнять метод в отдельном потоке,...

Таймер в отдельном потоке не работает
есть задача. по таймеру раз в 100мс наполнять массив. а по другому таймеру раз в 10мс проверять...

Обработка CheckBox в отдельном потоке
Всем привет, подскажите пожалуйста, у меня есть n-ое количество checkbox-ов как мне обработать их...

Создание контролов в отдельном потоке
Привет! В общем написал игру, работа которой основана на UserControl'ах. К каждому контролу...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru