Windows Phone ContactPicker 无法正常等待

Posted

技术标签:

【中文标题】Windows Phone ContactPicker 无法正常等待【英文标题】:Windows Phone ContactPicker won't await properly 【发布时间】:2015-04-07 08:38:41 【问题描述】:

虽然这已经在 *** 上发布过,但我认为这些都没有反映我的问题,而且这些解决方案也没有一个对我有用。所以我正在开发一个 Windows Phone 应用程序,我的工作流程有点像这样:

应用启动 ContactPicker 打开 用户选择一个或多个联系人 根据他选择的联系人数量,将多少 PivotItem 添加到 Pivot 中。

我的代码如下:

    protected override void OnNavigatedTo(NavigationEventArgs e)
    
        // TODO: Prepare page for display here.

        // TODO: If your application contains multiple pages, ensure that you are
        // handling the hardware Back button by registering for the
        // Windows.Phone.UI.Input.HardwareButtons.BackPressed event.
        // If you are using the NavigationHelper provided by some templates,
        // this event is handled for you.

        SelectContacts();
    

    private async Task SelectContacts()
    
        var picker = new ContactPicker();
        picker.DesiredFieldsWithContactFieldType.Add(ContactFieldType.PhoneNumber);

        ContactsList = (List<Contact>)await picker.PickContactsAsync();
        DisplayContacts();
    

    private void DisplayContacts()
    
        if (ContactsList != null)
        
            foreach (var item in ContactsList)
            
                PivotItem pivotItem = new PivotItem();
                pivotItem.Header = item.FirstName.ToString();

                ContentRoot.Items.Add(pivotItem);
            
        
    

据我说,在 SelectContacts() 方法中,应用程序应该在 await 调用中等待,一旦它返回联系人列表,它应该执行 DisplayContacts() 方法但它不起作用。我已经尝试了此代码的多种其他变体,但它们也无法正常工作。

【问题讨论】:

“不工作”是什么意思? @i3arnon 它的运行顺序不正确。 await 之后的任何内容都应该在该行完全执行后运行,但在我的情况下,它不会等待 await 行完全执行。 “等待之后的任何事情”是什么意思。我向您保证DisplayContacts 只会在等待的操作完成后运行。还有别的吗? @i3arnon 这正是问题所在。 DisplayContacts 在等待完成之前运行。我知道它不应该那样做,但确实如此。 我很难相信。如果你调用 PickContactAsync().Result 会发生什么。它的行为是否相同? 【参考方案1】:

等待 SelectContacts() 方法并在其下方添加 DisplayContacts() 方法。从 SelectContacts() 中移除 DisplayContacts() 方法

await SelectContacts();
DisplayContacts();

【讨论】:

也试过了。不工作。我仍然可以看到 ContactPicker 在我的模拟器上运行,而 DisplayContacts() 不等待 SelectContacts() 并开始执行。 尽量不要将 await 转换为 List。相反,做类似 'var contacts = await picker.getContactsAsync(); if (contacts != null) ContactsList = (List)contacts;'【参考方案2】:

我不知道完整的原因,但我发现由于我在 OnNavigatedTo() 事件中进行 PickContactsAsync() 调用,这就是它没有按预期工作的原因。一旦我将 PickContactsAsync() 调用移到 PageLoaded() 事件处理程序中,它就开始照常工作。

【讨论】:

以上是关于Windows Phone ContactPicker 无法正常等待的主要内容,如果未能解决你的问题,请参考以下文章