unauthorizedaccessexception在Silverlight中“消息框”

我有这样一段代码在我的Silverlight项目:

private void button1_Click(object sender, RoutedEventArgs e) { string baseUri = "http://foo.bar"; HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri(baseUri)); request.BeginGetResponse(new AsyncCallback(ReadCallback),request); } private void ReadCallback(IAsyncResult asynchronousResult) { HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState; HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult); using (StreamReader streamReader1 = new StreamReader(response.GetResponseStream())) { string resultString = streamReader1.ReadToEnd(); MessageBox.Show(resultString); } }

当我运行代码,我得到以下异常:

unauthorizedaccessexception Invalid cross-thread access.

我认为这是与返回的字符串的一个问题。 但是,即使我把这个:

MessageBox.Show("foobar");

相同的异常上升。 我认为这个问题来自于ReadCallback功能无法执行这样的行动。

你能帮助我吗?

谢谢,

此致

--------------解决方案-------------

我想这是因为Silverlight中的某些部分不能用代码来调用,而是必须来自用户的输入; 我认为,在MessageBox属于这一类。 所以,除非在MessageBox称为按压按钮或超链接的用户的一个结果是,它不会工作。

需要注意的是它不必须是在处理程序中的按钮或超链接点击事件; 任何地方进一步下跌的调用层次的工作。 我主要做的时候,我需要启动这样的行动是一个异步服务调用的结果,例如,是我dispalyed包含超链接说“点击这里打开你的X”或任何用户试图做一个ChildWindow(我想我用它来打开一个服务器生成的PDF或类似的文件)。

此外,如果在MessageBox确实没有所有他说大话我刚写了一篇被调用,跨线程访问异常可以解决通过调用Dispatcher.Invoke或Dispatcher.BeginInvoke传递一个委托,做了实际的行动。 这是因为异步操作(明显)发生在一个单独的线程,但Silverlight的,像WPF和像他们之前的WinForms,需要从只有一个线程访问它的控制; 调用使用控件的调度代表的行动,以正确的线程。

要使用BeginInvoke的解决方案,尝试简单地调用的MessageBox.show这样:

string resultString = streamReader1.ReadToEnd();
Dispatcher.Invoke(new Action(() => MessageBox.Show("")));

这是假设的代码是一个控制代码隐藏(用户控件,窗口,任何东西),所以调度属性可用。 您可以使用的BeginInvoke,而不是调用,如果你想允许用户界面的时间来正确地进行自我更新,但通常的差异是感觉不到的。

分类:Silverlight的 时间:2015-03-15 人气:2
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.561 (s). 10 q(s)