调用异步框架组件的正确方法是什么 - 等待答案然后返回值。 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
答案 0 :(得分:1)
虽然在现代Web应用程序中使用对Web服务器的同步调用阻止UI当然不常见,但您应该能够通过谨慎使用ManualResetEvent来做您想做的事情。
基本上,在下载过程中,以及失败或完成时,您的示例代码中的GetSomeString会等待(WaitOne,最好是超时) strong>的字符串下载,您将触发(Set)事件,以便GetSomeString中的阻塞方法将继续。您需要将下载结果与调用者放在一起,并确保它的线程安全。
答案 1 :(得分:1)
通常,我从第一个方法传回一个引用对象。然后,回调方法通过保留的引用修改对象。需要注意的是,如果对象在屏幕上显示属性,则确保您在UI线程上。