2011-12-23 14 views
0

私はビットマップを更新するために使用しなければならないディスパッチャを持っていますが、ディスパッチャ内のコードが終了する前に戻りラインが実行されます。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メソッドも、あなたがスレッドを使用する場合、必要な時に実行からのreturn文を防ぐことができない、非同期に行われます。

以下は私のコードです。コード構造を再フォーマットすることを検討する必要があります。私は、あなたがあなたのUIアップデートコードを、あなたがコレクションに入れるコードと分けることを提案します。スレッドからコレクションを取り出す。 メソッドはデータをロードして表示するか、またはデータを返すだけですか?私はresultを取得した後に停止し、それを返し、別のメソッドまたはコードブロックを使用してそのデータでUIを更新します。単に2つのタスクを分けるだけです。

関連する問題