Как вернуть код 2factor из делегата внутри не-пользовательского потока? - PullRequest
0 голосов
/ 27 октября 2019

Я работал только с WinForms и решил пойти на WPF, но столкнулся с проблемой, которую не могу решить:

Я хочу авторизоваться на vk.com через vkApi и сделатьчто, я должен передать делегату, возвращающему строку с кодом для 2factor auth

p.TwoFactorAuthorization = () =>
                {                 
                        var two = new TwoFactor();
                        two.ShowDialog();
                        return two.Data;
                };

Я решил ^ создать диалоговое окно, но получил " Вызывающий поток должен быть STAпотому что многие компоненты пользовательского интерфейса требуют этого"

vk.Authorize(p);

Хорошо, значит, этот метод ^ создает новый поток внутри, и мне нужно показать свой диалог из потока пользовательского интерфейса, я прав?

Я обнаружил, что Dispatcher.Invoke может помочь мне (не BeginInvoke, потому что мне нужно вернуть string ), и написал это

return Dispatcher.Invoke(() =>
                        {                    
                            var two = new TwoFactor();
                            two.ShowDialog();
                            return two.Data;
                        }));

Но теперь мое приложениепросто зависает и никаких диалогов не появляется! Что я делаю не так?

1 Ответ

0 голосов
/ 29 октября 2019

Я обнаружил, что API заблокировал основной поток, поэтому я вызвал AuthorizeAsync (), и основной поток стал доступен для отображения диалога Dispatcher.Invoke ()

Это выглядит так:

public void Func()
{
    vkParams.TwoFactor = () =>
    {
        return Dispatcher.Invoke(() =>
        {                    
            var two = new TwoFactor();
            two.ShowDialog();
            return two.Data;
        }));
    }
} 

private async void Auth()
{
    vkParams.Login = t_login.Text;
    vkParams.Password = t_pass.Text;
    await vkApi.AuthorizeAsync(vkParams);
}
...