c# - 是否应该为任何异步操作添加延迟?

原文 标签 c# windows-8 async-await windows-store-apps deferred

根据 Likness(第 164 页,“使用 C# 和 XAML 构建 Windows 8 应用程序”),“执行异步任务时,您必须要求延迟。”

所以如果我没有断章取意的话,这段代码:

private async Task<System.Collections.Generic.KeyValuePair<string, string>> SelectAContactForASlot()
{
    KeyValuePair<string, string> kvp; 
    var contactPicker = new Windows.ApplicationModel.Contacts.ContactPicker();
    contactPicker.CommitButtonText = "Select";
    var contact = await contactPicker.PickSingleContactAsync();
    if (contact != null)
    {
        kvp = new KeyValuePair<string, string>(contact.Name, contact.Emails[0].ToString());
        return kvp;
    }
    return kvp = new KeyValuePair<string, string>("No Name found", "No email found");
}

...应该是这样的:
private async Task<System.Collections.Generic.KeyValuePair<string, string>> SelectAContactForASlot()
{
    var deferral = e.SuspendingOperation.GetDeferral();
    KeyValuePair<string, string> kvp; 
    var contactPicker = new Windows.ApplicationModel.Contacts.ContactPicker();
    contactPicker.CommitButtonText = "Select";
    var contact = await contactPicker.PickSingleContactAsync();
    if (contact != null)
    {
        kvp = new KeyValuePair<string, string>(contact.Name, contact.Emails[0].ToString());
        return kvp;
    }
    return kvp = new KeyValuePair<string, string>("No Name found", "No email found");
    deferral.Complete();
}

正确的?

最佳答案

请记住,一个 async方法在遇到 await 时返回并且必须(异步)等待。

您需要延期时await来自 async void 的操作在返回之前必须完成的方法。这种“事件”真的是一个命令。例如,“鼠标移动”只是一个事件 - 系统不关心您是否处理该事件。但是“挂起”是一个命令——系统假定当你从命令返回时,你已经准备好被挂起。在这种情况下,延迟是必要的,以通知系统即使您正在返回,您还没有完成。

同样,如果您的后台任务具有 async,则需要延迟。 Run 的实现.因为当Run返回,您的后台任务被认为已完成,您需要一种方式来说明您还没有真正完成。

您可以通过 GetDeferral 的存在来判断事件处理程序是否支持这一点。方法。例如,Suspending支持延期,因为 SuspendingEventArgs有一个 SuspendingOperation具有 GetDeferral 的属性方法。在后台任务场景中(即,您有一个 async void Run ),您可以调用 GetDeferralIBackgroundTaskInstance传入Run .

您的 SelectAContactForASlot 示例返回 Task ,所以不需要延期。

关于c# - 是否应该为任何异步操作添加延迟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13421659/

相关文章:

c# - TextTransform.exe 似乎只接受旧版本的 C#

c# - 具有 10 个元素的随机 boolean 数组,其中 10 个元素中有 3 个为真

c# - 检测是否正在为 windows 8 或 wp 编译项目

javascript - JavaScript顺序执行多个功能

c# - 使用 async/await 时如何更好地处理已处置的控件

c# - 使用 EWS 获取邮箱权限

c# - 关闭一个表单然后调用另一个表单

c# - 在 Windows 8 中将内容添加到 groupeditemspage

c# - Windows 8 电脑不能迭代工作组成员?

javascript - 如何用 async/await 重构这个函数?