在Silverlight项目中调用异步javascript代码

在Silverlight项目中调用异步javascript代码,javascript,silverlight,Javascript,Silverlight,我们使用Silverlight作为web界面的解决方案。我们有一个现有的web服务,但将一个crossdomain和clientaccesspolicy文件放入服务器的根目录是我们最后的选择,因此我们将首先探索其他选项。我决定另一种方法是使用HtmlPage.Window.Invoke()并使用javascript调用Web服务,接收JSON数据,然后将其返回到Silverlight环境,在那里我将相应地解析它。我遇到了两个问题: 如果我同步调用它,我的UI线程将冻结,直到调用完成,我不知道如何

我们使用Silverlight作为web界面的解决方案。我们有一个现有的web服务,但将一个crossdomain和clientaccesspolicy文件放入服务器的根目录是我们最后的选择,因此我们将首先探索其他选项。我决定另一种方法是使用HtmlPage.Window.Invoke()并使用javascript调用Web服务,接收JSON数据,然后将其返回到Silverlight环境,在那里我将相应地解析它。我遇到了两个问题:

如果我同步调用它,我的UI线程将冻结,直到调用完成,我不知道如何解决它。我的印象是UI线程是唯一可以访问javascript的线程


如果我异步调用它,我不知道在readyState==4之前如何不返回数据。有什么想法吗?

这是一个基本的
XmlHttpRequest
解决方案,应该可以在大多数最新浏览器上使用:-

Javascript:-

 function getSomeJSON(url, callback)
 {
     var result = null;
     var xhr = new XmlHttpRequest();
     xhr.open("GET", url, true);
     xhr.onreadystatechanged = function()
     {
          if (xhr.readyState == 4)
          {
              if (xhr.status == 200)
              {
                  result = xhr.responseText;
              }
              xhr = null;
              callback(result);
          }
     }
     xhr.send(null);
 }
微光C#

void FetchData()
{
字符串url=GenerateUrlForService();
调用(“getSomeJSON”,新操作(jsonResult=>
{
//这里的代码用于处理json字符串结果。
//这将异步运行,因此不应阻塞UI线程
//在web服务调用期间。
}));
}

对于JSON是否有某种XML数据岛替代方案可以与IE7+、Chrome、Firefox 3+和,还有更新版本的Safari?如果您有其他问题或详细信息要添加到问题中,只需编辑您的问题,而不是对其进行评论。您能否澄清一下
如何不返回数据的含义
?如果您不想手动处理请求,您也可以使用jQuery的ajax API代替XmlHttpRequest。不管怎样,我同意在处理异步请求时使用回调方法是最好的方法。
 void FetchData()
 {
     string url = GenerateUrlForService();
     HtmlPage.Window.Invoke("getSomeJSON", new Action<string>(jsonResult =>
     {
         // Code here to handle the json string result.
         // This will run asynchronously so should not block the UI thread 
         // for the duration of the web service call.
     }));

 }