这可能更像是一个普通的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权限的猴子,那么我是否应该在程序中崩溃?