1

您好,这是我在这里的第一个问题,我创建了一个托管在 Azure 上的 Web 服务......我有一个 Windows 手机客户端应用程序和一个 Windows 8 Metro 客户端应用程序,现在当我连接 wp7 应用程序时,我使用这些方法来获取windows phone 上的服务中的一些东西:

        TimeTierBusiness.BusinessesClient client = new TimeTierBusiness.BusinessesClient();

        client.GetAllCompleted += new EventHandler<TimeTierBusiness.GetAllCompletedEventArgs>(client_GetAllCompleted);
        client.GetAllAsync();

为了得到结果,我只需转到 client_GetAllCompleted,如下所示:

    void client_GetAllCompleted(object sender, TimeTierBusiness.GetAllCompletedEventArgs e)
    {
        listNearbyBusinesses.ItemsSource = e.Result;
        myPopup.IsOpen = false;
    }

现在在 Windows 8 Metro 上,没有可以添加的 GetAllCompleted 事件来获得结果,当我在 Windows 8 上调用客户端时,我得到的只是等待的 GetAllAsync() 方法......

任何帮助将不胜感激,因为我现在无法在我的 Metro 应用程序上使用此服务

谢谢 :)

好的,所以解决方案是,要创建一个异步方法,请参见下面的代码:

        //My WCF Service Client
        TimeTierBusiness.BusinessesClient bClient = new TimeTierBusiness.BusinessesClient();
        //The list I am going to get from the service
        public List<TimeTierBusiness.BusinessRatingViewModel> listBusinessViewModel;

此方法从服务中异步填充列表

       private async void GetAllAsyc()
    {

        System.Collections.ObjectModel.ObservableCollection<TimeTierBusiness.BusinessRatingViewModel> x = await bClient.GetAllAsync();
        listBusinessViewModel = x.ToList();
        ItemListView.ItemsSource = listBusinessViewModel;
    }
4

1 回答 1

0

Windows 8(实际上是它附带的 .NET 4.5)具有有史以来最令人讨厌的特性之一。它基于 await/async 关键字,它本质上允许您编写异步代码,就好像它是同步的一样. 在工作和宠物项目中,我最终都编写了大量异步代码,在看到这个功能后,我决定将我的下一个孩子作为牺牲献给 .NET 人(因为这个功能就是很好,因为我已经有 3 个孩子,并且真的不想要另一个)。

它的要点是您编写用于调用异步服务的代码(在这种情况下),就像您使用常规方法一样,但不是挂钩事件以完成,您只需“等待”异步调用的结果并在在它下面的行,继续处理结果 - 编译器做了一些黑魔法(如果你曾经使用过 yield return,它是一种非常相似的黑魔法)并将你的方法变成一系列方法 + 一个状态机以正确的顺序调用。

在此处阅读有关它的更多信息

于 2012-04-20T15:45:41.580 回答