在Silverlight2 beta2中由于线程模型的修改,无法向beta1中一样更新UI,包括Alert都不行,原理我这里就不说了,这里提供一个
参考的解决办法,也是参看了一些文章才整出来的,提供个简单的,供大家参考。
//定义一个静态类成员,具体怎么定义可根据自己需要,
//我这里只是做个测试的,没有多考虑其他的
//主要是定义一个静态的Dispatcher在其他地方可以访问
public class MyDispatcher
{
public static Dispatcher MyDp;
}
//Application的事件
private void OnStartup(object sender, StartupEventArgs e)
{
this.RootVisual = new Page();
//一定要在此处把this.RootVisual.Dispatcher保存到某个地方
//如果想用的时侯在通过this.RootVisual.Dispatcher来访问在异步方法
//中是访问不到的,根新的线程并发模型有关,不详述
MyDispatcher.MyDp = this.RootVisual.Dispatcher;
}
/// <summary>
/// Response事件,处理返回结果
/// </summary>
/// <param name="asyncResult"></param>
private void ResponseReady(IAsyncResult asyncResult)
{
HttpWebRequest request = asyncResult.AsyncState as HttpWebRequest;
HttpWebResponse response = request.EndGetResponse(asyncResult) as HttpWebResponse;
if (response.StatusCode == HttpStatusCode.OK)
{
using (Stream responseStream = response.GetResponseStream())
{
StreamReader reader = new StreamReader(responseStream);
string resultContent = reader.ReadToEnd();
//注意此处理的调用方式,一定要通过主线程
//UI的Dispatcher来调用才能使processResult的逻辑在
//主线程的上下文中运行,才能访问主线程的UI元素
MyDispatcher.MyDp.BeginInvoke(delegate { ProcessResult(resultContent); });
}
}
}
private void ProcessResult(string xmlResult)
{
//做你自己的处理逻辑,可以正常访问主线程UI元素
}