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