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 无法正常等待的主要内容,如果未能解决你的问题,请参考以下文章

Windows Phone 应用程序仅适用于 Windows Phone 7?

windows phone 8 和 10 的 windows phone 应用程序开发

是否可以将 Windows Phone App 项目转换为 Windows Phone 类库?

Windows Phone 8.0 DLL 是不是与 Windows Phone 8.1 应用程序兼容?

VS2010 Express for Windows Phone 有中文吗?那里有下载?官方的Windows Phone Developer Tools 是英文版

Windows-Phone-7:检查 soundEffectInstance 的实例是不是正在播放