在Dispatcher.invoke方法之后返回

时间:2011-12-23 03:08:50

标签: c# .net

我有一个Dispatcher,我必须使用它来更新我的位图,但是在调度程序内的代码完成之前执行返回行,因此结果不符合预期。

如何在调度程序完成后返回值?我不能把退货留在调度员里面。

以下是我的代码:

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 个答案:

答案 0 :(得分:1)

您正在调用一个新线程并且BeginInvoke也是异步完成的,如果您使用线程,则无法阻止return语句执行。您应该考虑重新格式化代码结构。我建议您将UI更新代码与填充集合的代码分开。取出从线程中填充集合。 您的方法是应该加载和显示数据,还是只返回它?我会在获得result之后停止,返回它,并使用另一个方法或代码块来更新具有该数据的UI。简单地将两个任务分开。