2011-12-23 3 views
0

У меня есть диспетчер, который я должен использовать для обновления моего растрового изображения, однако линия возврата выполняется до завершения кода внутри диспетчера, поэтому результат не так, как ожидалось.return after Dispatcher.invoke метод

Как я могу вернуть значение после завершения диспетчера? Я не могу оставить возвращение внутри диспетчера.

Ниже мой код:

public ObservableCollection<FavoriteStruct> LoadMobion() 
    { 
     List<FavoriteMobion> results; 
     using (FavoriteDataContext context = new FavoriteDataContext(connectionString)) 
     { 
      IQueryable<FavoriteMobion> query = from c in context.TbFavoriteMobion 
              select c; 
      results = query.ToList(); 
     } 
     ObservableCollection<FavoriteStruct> lstFavStr = new ObservableCollection<FavoriteStruct>(); 
     if (results != null) 
     { 
      Thread load = new Thread(new ThreadStart(() => 
      { 
       Deployment.Current.Dispatcher.BeginInvoke(() => 
       { 
        foreach (var rst in results) 
        { 
         BitmapImage bi; 
         bi = new BitmapImage(); 
         bi.UriSource = new Uri("../Images/default_avatar_small.jpg", UriKind.Relative); 
         lstFavStr.Add(new FavoriteStruct() 
         { 
          Opacity = 0.8f, 
          Status = "../Images/offline.png", 
          RealID = rst.RealID, 
          GroupType = rst.GroupType, 
          MsgStatus = rst.MsgStatus == "" ? "offline" : rst.Path, 
          Name = rst.Name, 
          Path = rst.Path == "" ? "" : rst.Path, 
          Phone = rst.Phone, 
          Picture = bi 
         }); 
        } 
       }); 
      })); 
      load.Start(); 
      load.Join(); 
     } 
     return lstFavStr; 
    } 

ответ

1

Вы вызываете новую нить и BeginInvoke также выполняются асинхронно, вы не можете предотвратить оператор возврата от выполнения, если вы хотите, если вы используете темы. Вы должны переформатировать структуру кода. Я предлагаю вам разделить код обновления UI с кодом, который вы заполняете коллекцией. Извлеките коллекцию из нити. Предполагается, что ваш метод должен загружать и отображать данные или только возвращать его? Я бы остановился после получения result, вернул его и использовал другой метод или блок кода для обновления пользовательского интерфейса с этими данными. Просто отделите две задачи.