【问题标题】:Silverlight waiting for asynchronous callSilverlight 等待异步调用
【发布时间】:2011-11-29 19:10:07
【问题描述】:

我有一个 Silverlight 应用程序,它启动了,它需要读取一个 web 服务返回的配置文件。

所以,在我的主页中,我想要这样的东西:

public MainPage()
{
    InitializeComponent();
    Config cfg = new Config();
    XDocument config = cfg.getConfig();
    //doing stuff with config here
    ...
}

config 的构造函数调用 readConfigAsnc,我有一个 readcompleted 方法,它返回 xdocument。我希望在 MainPage() 中继续执行之前调用 readConfigCompleted。这样做的最佳方法是什么?

【问题讨论】:

    标签: c# .net silverlight wcf


    【解决方案1】:

    最好的方法是把它分成两种方法。将函数作为 getConfig 的参数传递,如下所示:

    cfg.getConfig( fcnToCall );
    

    稍后,在您的代码中,

    void fcnToCall( XDocument config )
    {
        //Do stuff with config here...
    }
    

    如果您想保留局部变量,另一种选择是使用 lambda 表达式:

    Config cfg = new Config();
    cfg.Callback += new Action<XDocument> action = s => 
            {
                XDocument cfg = s as XDocument;
                //Do stuff with config here...
            };
    cfg.getConfig();
    

    【讨论】:

    • 如何将 XDocument 配置参数传递给 fcnToCall?现在,getConfig 返回 XDocument 配置对象。
    • 您的 getConfig(...) 调用需要修改以接受委托。完成后,它应该调用该委托。您可以查看我的编辑以获取设置接受一个参数的委托的示例(Action 是接受该参数的默认委托)。
    • 或者,你可以做我的第二个并使用 lambda 表达式。
    • 你好像只有一个例子?两者的区别在哪里?
    • 一个使用 lambda 表达式,另一个只是传递一个函数作为委托。它们都做同样的事情,但我喜欢 lambda 表达式(如果您不熟悉它们,请查看它们,它们非常有用。)
    【解决方案2】:

    为什么不把方法分开呢?不是在 MainPage() 中发生所有这些,而是​​在 GetConfigCompleted 事件中发生“Do Stuff”。

    【讨论】:

    • 我想做的大部分事情都在主页中。像 UI 元素之类的。
    • Silverlight 最强大的部分是它的数据绑定...我敢打赌,您可以将尝试操作的大部分内容绑定到视图模型,从而提高项目的可维护性。
    猜你喜欢
    • 2012-10-24
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多