在facebook windows手机应用程序中未处理System.ObjectDisposedException

本文关键字:未处理 System ObjectDisposedException 应用程序 facebook windows 手机 | 更新日期: 2023-09-27 18:19:53

这一行出现错误:"无法访问已处理的对象"。

db._fbcontacts.InsertOnSubmit(new FacebookContactsList { Name = FBName });

有什么原因呢?

有一种方法,我想在本地数据库中写下来自facebook的用户帐户名称

public void LoadUserInfo()
     {
         using (FacebookDataContext db = new FacebookDataContext(DBConnectionstring))
         {
             FacebookClient fb = new FacebookClient(App.AccessToken);
             fb.GetCompleted += (o, e) =>
             {
                 var result = (IDictionary<string, object>)e.GetResultData();
                 var FBName = String.Format("{0} {1}", (string)result["first_name"], (string)result["last_name"]);
                 db._fbcontacts.InsertOnSubmit(new FacebookContactsList { Name = FBName });
                 db.SubmitChanges();
             };
             fb.GetTaskAsync("me");
         }
     }

在facebook windows手机应用程序中未处理System.ObjectDisposedException

您的回调方法在FacebookDataContext被释放后被调用。

这是立即执行的代码

 using (FacebookDataContext db = new FacebookDataContext(DBConnectionstring))
 {
     FacebookClient fb = new FacebookClient(App.AccessToken);
     // no callback method is being executed here!  
     fb.GetTaskAsync("me");
 }

然后,稍后当GetTaskAsync完成时,执行以下操作:

var result = (IDictionary<string, object>)e.GetResultData();           
/*blah blah snip*/
db._fbcontacts.InsertOnSubmit(new FacebookContactsList { Name = FBName });
db.SubmitChanges();

但是,您可以从第一个代码块中看到,在退出using语句的作用域时,db已经被释放

相反,您需要将数据库从using块中拉出并手动处理它。。。

 public void LoadUserInfo()
 {
     FacebookDataContext db = new FacebookDataContext(DBConnectionstring);
     FacebookClient fb = new FacebookClient(App.AccessToken);
     fb.GetCompleted += (o, e) =>
     {
         try
         {
             /*blah fricken blah snipped */
             db.SubmitChanges();
         }finally{
             if(db != null) db.Dispose();
         }
     };
     fb.GetTaskAsync("me");
 }

或者,您可以在事件处理程序中提取上下文的实例化。

public void LoadUserInfo()
{
    FacebookClient fb = new FacebookClient(App.AccessToken);
    fb.GetCompleted += (o, e) =>
    {
        /*yadda mfing blah */
        using (FacebookDataContext db = new FacebookDataContext(DBConnectionstring))
        {
            db._fbcontacts.InsertOnSubmit(new FacebookContactsList { Name = FBName });
            db.SubmitChanges();
        }
    };
    fb.GetTaskAsync("me");
}
相关文章: