System.ObjectDisposedException не обрабатывается в приложении Windows Phone для Facebook

1

В этой строке появляется ошибка: "Не удается получить доступ к удаленному объекту".

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

Что может быть причиной этого?

Существует метод, когда я хочу написать имя учетной записи пользователя из facebook в localdatabase

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
facebook-graph-api
windows-phone-8
windows-phone-7

1 ответ

2
Лучший ответ

Ваш метод обратного вызова вызывается после того, как был удален объект FacebookDataContext.

Это код, который выполняется немедленно

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

то, когда- GetTaskAsync позже, когда GetTaskAsync завершится, выполняется следующее:

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

Но из первого блока кода вы можете видеть, что после выхода из области using оператора db уже был удален.

Вместо этого вам нужно вытащить db из блока использования и утилизировать его вручную...

 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");
}
  • 0
    Это очень хороший ответ. Но после первого запуска обработки текущей строки db.SubmitChanges (); Visual Studio не выполняет код. Без ошибок. после второго запуска приложение работает

Ещё вопросы

Сообщество Overcoder
Наверх
Меню