Silverlight异步调用和匿名方法

时间:2009-05-07 18:27:14

标签: c# silverlight asynchronous delegates

我知道在这种事情上有几个争论。 无论如何,我有几种情况需要根据WCF服务返回的枚举来填充ComboBox项目。

为了保持代码清洁,我开始采用这种方法。在进一步研究之后,我认为最初没有考虑到这一点......

我正在抛出这些内容,以获取有关如何执行此操作或目前如何执行此操作的建议/建议/代码段。

我可能被迫有一个单独的,非匿名的方法,程序。我讨厌这样做的事情,但此刻,不要看到它以另一种方式工作......

EventHandler<GetEnumerationsForTypeCompletedEventArgs> ev = delegate(object eventSender, GetEnumerationsForTypeCompletedEventArgs eventArgs)
{
    if (eventArgs.Error == null)
    {
        //comboBox.ItemsSource = eventArgs.Result;
        //populate combox for display purposes (for now)
        foreach (Enumeration e in eventArgs.Result)
        {
            ComboBoxItem cbi = new ComboBoxItem();
            cbi.Content = e.EnumerationValueDisplayed;
            comboBox.Items.Add(cbi);
        }
        // remove event so we don't keep adding new events each time we need an enumeration
        proxy.GetEnumerationsForTypeCompleted -= ev;
    }
};
proxy.GetEnumerationsForTypeCompleted += ev;
proxy.GetEnumerationsForTypeAsync(sEnumerationType);

基本上在这个例子中我们使用ev来保存匿名方法,这样我们就可以在方法中使用ev从被调用的事件中删除它。这可以防止多次调用此方法。

我怀疑在此调用之前声明的ComboBox本地var,但在同一方法中,并不总是ComboBox最初的意图,但还不能真正验证。我可以为它添加一个标签来进行一些测试并填充以进行验证。

对不起,如果不清楚的话。如果需要,我可以详细说明。

感谢。

1 个答案:

答案 0 :(得分:1)

我这样做是这样的:

var query = from t in GetFreshContext().Employee select t;
var dsQuery = (DataServiceQuery<Employee>)query;
dsQuery.BeginExecute(result =>
{
    ComboEmployees.ItemsSource = dsQuery.EndExecute(result).ToArray();
}, null);
ComboEmployees.DisplayMemberPath = "FullName";

我写了blog post regarding some other problems and this