Silverlight方法中的异步操作 - 返回值

时间:2010-03-26 04:03:02

标签: c# .net silverlight asynchronous

调用异步框架组件的正确方法是什么 - 等待答案然后返回值。 AKA以单一方法包含整个请求/响应。

示例代码:

    public class Experiment
    {
     public Experiment()
     {

     }
        public string GetSomeString()
        {
            WebClient wc = new WebClient();
            wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);
            Uri u = new Uri("http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&topic=t&output=rss");
            wc.DownloadStringAsync(u);
            return "the news RSS from Google";
        }

        private void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {

            //don't really see how this callback method makes it able
            // to return the answer I'm looking for on the return
            // statement in the method above.
        }
    }

更多信息: 我之所以这么说是因为我正在开发一个项目,我想在浏览器中使用JavaScript代码,将Silverlight像Facade / Proxy一样用于Web服务和复杂的计算&操作。我想同步调用Silvelight中的[ScriptableMembers]。我不希望Silverlight回调到浏览器的JavaScript

2 个答案:

答案 0 :(得分:1)

虽然在现代Web应用程序中使用对Web服务器的同步调用阻止UI当然不常见,但您应该能够通过谨慎使用ManualResetEvent来做您想做的事情。

基本上,在下载过程中,以及失败完成时,您的示例代码中的GetSomeString会等待(WaitOne,最好是超时) strong>的字符串下载,您将触发(Set)事件,以便GetSomeString中的阻塞方法将继续。您需要将下载结果与调用者放在一起,并确保它的线程安全。

答案 1 :(得分:1)

通常,我从第一个方法传回一个引用对象。然后,回调方法通过保留的引用修改对象。需要注意的是,如果对象在屏幕上显示属性,则确保您在UI线程上。