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

C# 是否应该为任何异步操作添加延迟?,c#,windows-8,async-await,windows-store-apps,deferred,C#,Windows 8,Async Await,Windows Store Apps,Deferred,根据喜欢度p。164,使用C和XAML构建Windows 8应用程序,在执行异步任务时,必须请求延迟 因此,如果我没有断章取义,以下代码: private async Task<System.Collections.Generic.KeyValuePair<string, string>> SelectAContactForASlot() { KeyValuePair<string, string> kvp; var contactPicke

根据喜欢度p。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();
}
正确吗?

请记住,异步方法在遇到等待时返回,并且必须异步等待

当您等待异步void方法的操作时,需要延迟,该操作必须在返回之前完成。这类事件实际上是一个命令。例如,移动鼠标只是一个事件-系统不关心您是否处理该事件。但是suspend是一个命令——系统假设当您从命令返回时,您已经做好了被挂起的准备。在这种情况下,延迟是必要的,以通知系统,即使您返回,您还没有完成

类似地,如果您有一个异步执行Run的后台任务,则需要延迟。因为当Run返回时,您的后台任务被认为已经完成,您需要一种方式来表示您还没有真正完成

您可以通过存在getDeleral方法来判断事件处理程序是否支持此操作。例如,挂起支持延迟,因为SuspendingEventArgs具有SuspendingOperation属性,该属性具有GetDeferral方法。在后台任务场景(即,您有一个异步void运行)中,您可以对传递到Run中的ibackgroundtask实例调用getdeleral


您的SelectaContactForSlot示例返回任务,因此它不需要延迟。

只是加强Stephen所说的。。。根据Stephen的描述,必问的上下文在命令中