“在另一个线程上运行时,对象引用未设置为对象的实例”

时间:2014-02-12 10:10:31

标签: c# multithreading twitter windows-phone-8

我正在尝试从静态类(称为TitterHandler)使用TweetSharp,所以理论上我可以稍后将其交换出来。

该示例建议使用Dispatch.BeginInvoke,因此在更新UI时,可以使用UI线程完成。

我想将数据加载到模型中,尽管这肯定会触发更新UI的OnPropertyChanged事件。由于这是静态方法,我使用System.Windows.Deployment.Current.Dispatcher.BeginInvoke

然而,它不会因“未设置为引用的对象”异常而崩溃。我对线程的了解相当有限,但是从我收集的内容

  • UI线程需要更新UI,但主线程可以触发一个事件,然后由UI线程拾取 - 为了测试这个我分配给一个完全独立于UI的静态变量(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;
                }

            });
        }


    }




}

1 个答案:

答案 0 :(得分:2)

我们的共享调试功能显示status.Place为空。

(其他选项可能但不太可能:调用者处置statuses成员)