首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从非ui线程中的委托返回2元素代码?

如何从非ui线程中的委托返回2元素代码?
EN

Stack Overflow用户
提问于 2019-10-27 18:49:26
回答 1查看 42关注 0票数 0

我只与WinForms合作,并决定继续使用WPF,但遇到了一个我无法解决的问题:

我想通过vk.com通过vkApi授权,要做到这一点,我必须传递委托返回字符串和代码为2因子auth。

代码语言:javascript
复制
p.TwoFactorAuthorization = () =>
                {                 
                        var two = new TwoFactor();
                        two.ShowDialog();
                        return two.Data;
                };

我决定^创建一个对话框窗口,但是得到了“调用线程必须是STA,因为许多UI组件都需要这个”。

代码语言:javascript
复制
vk.Authorize(p);

好的,这意味着这个^方法在里面创建了一个新线程,我需要从UI线程中显示我的对话框,对吗?

我发现Dispatcher.Invoke可以帮助我(不是BeginInvoke,因为我需要返回字符串)并编写了以下内容

代码语言:javascript
复制
return Dispatcher.Invoke(() =>
                        {                    
                            var two = new TwoFactor();
                            two.ShowDialog();
                            return two.Data;
                        }));

但现在,我的应用程序只是冻结,没有对话框出现!我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2019-10-29 12:29:41

我发现api阻塞了主线程,所以我调用了AuthorizeAsync(),主线程可以通过Dispatcher.Invoke()显示对话框。

看起来是这样的:

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58582326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档