Ссылка на объект не указывает на экземпляр объекта при работе в другом потоке

Я пытаюсь использовать TweetSharp из статического класса (называемого TitterHandler), поэтому теоретически я могу заменить его позже.

В примере предлагается использовать Dispatch.BeginInvoke, поэтому при обновлении пользовательского интерфейса это выполняется с использованием потока пользовательского интерфейса.

Я хотел бы просто загрузить данные в модель, хотя, по общему признанию, это вызовет событие OnPropertyChanged, которое обновит пользовательский интерфейс. Поскольку это статический метод, я использую System.Windows.Deployment.Current.Dispatcher.BeginInvoke.

Однако он продолжает падать с исключением «Объект не установлен в ссылку». У меня довольно ограниченное понимание потоков, но из того, что я собираю

  • Поток пользовательского интерфейса должен обновить пользовательский интерфейс, но основной поток может запустить событие, которое затем подхватывается потоком пользовательского интерфейса. Чтобы проверить это, я назначаю статическую переменную, полностью отдельную от пользовательского интерфейса (TweetCache), но приложение по-прежнему аварийно завершает работу.
  • Поток может быть удален сборщиком мусора, если на него нет ссылок. Я поместил ссылку (Thread) на класс, но все равно происходит сбой.

У меня нет идей, вот код...

public class TwitterHandler
{

    public static TwitterService Service = new TwitterService(AppConfig.TwitterConsumerKey, AppConfig.TwitterConsumerSecret);

    internal static void LoadTweetsFromWeb()
    {
        TwitterHandler.Service.AuthenticateWith(AppConfig.TwitterToken, AppConfig.TwitterTokenSecret);
        TwitterHandler.Service.ListTweetsOnUserTimeline(new ListTweetsOnUserTimelineOptions() 
            { ScreenName = AppConfig.NewsBrandingTwitterHandle, }, 
            TwitterHandler.OnTweetsLoaded);
    }


    // Put this here to maintain a refrence to the thread to avoid GC
    public static DispatcherOperation Thread;

    // A 'thread external' reference with no onward events that trigger UI changes
    public static List<Tweet> TweetCache;

    public static void OnTweetsLoaded(IEnumerable<TwitterStatus> statuses, TwitterResponse res)
    {
        if (res.StatusCode == HttpStatusCode.OK)
        {
            TwitterHandler.Thread = System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
            {
                List<Tweet> tweets = new List<Tweet>();
                foreach (TwitterStatus status in statuses)
                {
                    tweets.Add(new Tweet()
                    {
                        Content = status.Text,
                        UrlString = status.Place.Url,
                    });
                }
                if (tweets.Count > 0)
                {
                    // App.Tweets = tweets;
                    // TweetCache raises no 'PropertyChanged' event
                    TwitterHandler.TweetCache = tweets;
                }

            });
        }


    }




}

person Brendan    schedule 12.02.2014    source источник
comment
Где (в какой строке) выбрасывается исключение?   -  person rene    schedule 12.02.2014
comment
Исключение действительно расплывчатое (отсутствует объект «pdb»), когда я прошел через него, он замер в цикле foreach при добавлении статусов...   -  person Brendan    schedule 12.02.2014
comment
status.Place гарантированно не будет нулевым?   -  person rene    schedule 12.02.2014
comment
Черт ты прав. Параметр Place - это не то, что я думал, и он равен нулю. Очень раздражает, что отладчик перестает давать полезную информацию внутри потока - дайте ответ, и я закрою вопрос...   -  person Brendan    schedule 12.02.2014
comment
stackoverflow.com/questions/4660142/   -  person Soner Gönül    schedule 12.02.2014
comment
@Soner Хех, это был отличный ТАК вопрос. Я знаю, что такое Null Reference, но проблема с потоками заключается в том, что я автоматически предполагаю, что это что-то более глубокое, «потому что потоки» и окружающий их FUD...   -  person Brendan    schedule 12.02.2014


Ответы (1)


Наши общие возможности отладки показали, что status.Place равно нулю.

(могут быть и другие варианты, но они менее вероятны: вызывающий объект распоряжается statuses членом)

person rene    schedule 12.02.2014