silverlight更新UI

wengyuli 2010-06-17 03:53:39
我需要从服务端取数据并更新到silverlight的UI上,但是这端代码有问题,代码如下:
#region 定时检测信息
public void GetMessages(object obj)
{
chatServiceClient = new ChatService.ChatServiceClient(binding,endPoint);
chatServiceClient.GetMessagesCompleted += new EventHandler<ChatService.GetMessagesCompletedEventArgs>(GetMessagesComleted);
chatServiceClient.GetMessagesAsync("wengyuli");
}

void GetMessagesComleted(object sender, ChatService.GetMessagesCompletedEventArgs e)
{
ObservableCollection<ChatService.MessageInfo> listMsg = new ObservableCollection<ChatService.MessageInfo>();
if(e.Error==null)
{
this.listMsgs.ItemsSource= e.Result; //这里提示 跨线程错误
}
}
#endregion


大家有没有办法
...全文
141 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sunpire 2010-06-18
  • 打赏
  • 举报
回复
Dispatcher 类
http://msdn.microsoft.com/zh-cn/library/system.windows.threading.dispatcher(VS.95).aspx

Dispatcher 类当前只提供从非用户界面 (UI) 线程在 UI 上运行代码的支持。

您可以通过 DependencyObject.Dispatcher 和 ScriptObject.Dispatcher 属性访问 UI 线程的 Dispatcher 对象。这些方法是实例方法,但这些类型的实例无法频繁从非 UI 线程访问。但是,该应用程序的 Deployment 对象是 DependencyObject,并且它可通过其 Current 属性用于任何线程。

您可以调用 CheckAccess 方法以确定调用方是否处于 UI 线程上。如果调用方不处于 UI 线程上,则可以调用 BeginInvoke 以便对 UI 线程运行指定的委托。


WPF中关于Dispatcher 类 的说明
http://msdn.microsoft.com/zh-cn/library/system.windows.threading.dispatcher.aspx

在 WPF 中,DispatcherObject 只能通过与它关联的 Dispatcher 进行访问。例如,后台线程不能更新与 UI 线程中的 Dispatcher 关联的 Button 内容。为了使该后台线程能够访问 Button 的 Content 属性,该后台线程必须将此工作委托给与该 UI 线程关联的 Dispatcher。这可以通过使用 Invoke 或 BeginInvoke 来完成。Invoke 是同步操作,而 BeginInvoke 是异步操作。该操作将按指定的 DispatcherPriority 添加到 Dispatcher 的队列中。
wengyuli 2010-06-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sunpire 的回复:]
引用楼主 wengyuli 的回复:
#region 定时检测信息

从 LZ 的“#region 定时检测信息” 猜测是在定时器或线程中调用 WCF ,
出错的原因是“不是从创建listMsgs的GUI的线程去设置 listMsgs.ItemsSource” ,解决的方法我想有两种,
一种是让“创建listMsgs的GUI的线程去设置 listMsgs.ItemsSource”

……
[/Quote]
你好,可以解释第一个代码吗
wengyuli 2010-06-18
  • 打赏
  • 举报
回复
非常感谢
Sunpire 2010-06-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 wengyuli 的回复:]
#region 定时检测信息
[/Quote]
从 LZ 的“#region 定时检测信息” 猜测是在定时器或线程中调用 WCF ,
出错的原因是“不是从创建listMsgs的GUI的线程去设置 listMsgs.ItemsSource” ,解决的方法我想有两种,
一种是让“创建listMsgs的GUI的线程去设置 listMsgs.ItemsSource”

if (this.listMsgs.Dispatcher.CheckAccess())
{
this.listMsgs.ItemsSource= e.Result;
}
else
{
this.listMsgs.Dispatcher.BeginInvoke( 这里需要写一个回调方法,也可以是匿名方法);
// 如
this.listMsgs.Dispatcher.BeginInvoke(() => { this.listMsgs.ItemsSource = e.Result; });
}


方法二, 直接处理 this.listMsgs.ItemsSource

ObservableCollection<T> source = new ObservableCollection<T>();
this.listMsgs.ItemsSource = this.source ;
...
每次从WCF异步返回时
this.source.Clear();
foreach(T item in e.Result)
{
this.source.Add(T);
}
wengyuli 2010-06-17
  • 打赏
  • 举报
回复

SynchronizationContext syn;
public void GetMessages(object obj)
{
syn = SynchronizationContext.Current;

chatServiceClient = new ChatService.ChatServiceClient(binding,endPoint);
chatServiceClient.GetMessagesCompleted += new EventHandler<ChatService.GetMessagesCompletedEventArgs>(GetMessagesComleted);
chatServiceClient.GetMessagesAsync("wengyuli");
}

void GetMessagesComleted(object sender, ChatService.GetMessagesCompletedEventArgs e)
{
ObservableCollection<ChatService.MessageInfo> listMsg = new ObservableCollection<ChatService.MessageInfo>();
if(e.Error==null)
{
syn.Post(GetRs,e.Result);

}
}

void GetRs(object rs)
{

this.listMsgs.ItemsSource=rs;

}
zhuzhi 2010-06-17
  • 打赏
  • 举报
回复
SynchronizationContext syn;
public void GetMessages(object obj)
{
syn = SynchronizationContext.Current;

chatServiceClient = new ChatService.ChatServiceClient(binding,endPoint);
chatServiceClient.GetMessagesCompleted += new EventHandler<ChatService.GetMessagesCompletedEventArgs>(GetMessagesComleted);
chatServiceClient.GetMessagesAsync("wengyuli");
}

void GetMessagesComleted(object sender, ChatService.GetMessagesCompletedEventArgs e)
{
ObservableCollection<ChatService.MessageInfo> listMsg = new ObservableCollection<ChatService.MessageInfo>();
if(e.Error==null)
{
syn.Post(GetRs,e.Result);

}
}

void GetRs(object rs)
{

this.listMsgs.ItemsSource=rs;

}

8,734

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧