Facebook SDK和线程(WebBrowser控件)

时间:2011-12-26 13:52:46

标签: c# facebook

这可能更像是一个普通的c#和简单的线程问题而不是Facebook SDK问题,但我可能错了。但我真的可以使用一些帮助。我正在重用SDK附带的示例代码,其中包含一个FacebookLoginDialog类。我目前正在使用它。在我的GetMessages,GetFriendRequests和其他Get *类中,我总是尝试/捕获这样的调用:

try
{
    var result = (IDictionary<string, object>)fb.Get("/me/inbox");
}
catch (FacebookOAuthException e)
{
    FacebookSession.Login();
}

这是我的FacebookSession类中的登录方法

public static void Login()
{
    var fbLoginDialog = new FacebookLoginDialog(APP_ID, EXTENDED_PERMISSIONS);
    DialogResult dr = fbLoginDialog.ShowDialog();
    DisplayAppropriateMessage(fbLoginDialog.FacebookOAuthResult);
}

这是我的FacebookLoginDialog类中的构造函数(这是我遇到问题的地方)

public FacebookLoginDialog(string appId, string[] extendedPermissions, bool logout)
{
    try
    {
        var oauth = new FacebookOAuthClient { AppId = appId };
        var loginParameters = new Dictionary<string, object>
        {
            { "response_type", "token" },
            { "display", "popup" }
        };

        if (extendedPermissions != null && extendedPermissions.Length > 0)
        {
            var scope = new StringBuilder();
            scope.Append(string.Join(",", extendedPermissions));
            loginParameters["scope"] = scope.ToString();
        }

        var loginUrl = oauth.GetLoginUrl(loginParameters);

        if (logout)
        {
            var logoutParameters = new Dictionary<string, object>
                                {
                                    { "next", loginUrl }
                                };

            System.Uri uri = 
               new Uri("https://www.facebook.com/logout.php?next=" +
               "https://www.facebook.com/connect/login_success.html&access_token=" + 
               FacebookSession._accessToken);
            this.navigateUrl = uri;
        }
        else
        {
            this.navigateUrl = loginUrl;
        }
        InitializeComponent(); // crash here... sometimes
    }
    catch (Exception e)
    {
        //Log error message
    }
}

对不起所有代码,但现在问题了。这段代码第一次运行正常。如果我去Facebook的Facebook应用程序权限页面并删除应用程序(即删除其权限),而我的桌面应用程序在这里没有运行,当我启动它时,它看到它没有权限并显示登录对话框。我可以保存access_key,它会正常工作。但是,如果我在我的桌面应用程序运行时访问Facebook应用程序页面并获取权限,那么就会发生不好的事情。我收到一条关于activex控件无法实例化的错误消息,因为当前线程不在单线程单元中。我在这里看过很多帖子,说你要做的就是把[STAThread]放在你的main()上面,我的代码就是这样。我也尝试创建一个新线程来调用FacebookLoginDialog,但不仅这样做不起作用,而且由于我的代码实际上不是设计为在多个线程中运行,因此开始引起更多问题。

是否有一个简单的解决方案,或者我是否需要重新设计我的代码才能在多个线程中正确运行?或者,如果有人在我的应用程序运行时拥有具有facebook权限的猴子,那么我是否应该在程序中崩溃?

0 个答案:

没有答案