Я пытаюсь использовать 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;
}
});
}
}
}
foreach
при добавлении статусов... - person Brendan   schedule 12.02.2014status.Place
гарантированно не будет нулевым? - person rene   schedule 12.02.2014Place
- это не то, что я думал, и он равен нулю. Очень раздражает, что отладчик перестает давать полезную информацию внутри потока - дайте ответ, и я закрою вопрос... - person Brendan   schedule 12.02.2014