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

c# – 是否应该为任何异步 *** 作添加延迟?,第1张

概述根据Likness(第164页,“使用C#和XAML构建 Windows 8应用程序”),“执行异步任务时,您必须要求延期.” 所以如果我没有把他从背景中删除,这段代码: private async Task<System.Collections.Generic.KeyValuePair<string, string>> SelectAContactForASlot(){ KeyValu 根据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,"No email found");    deferral.Complete();}

正确?

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

等待来自异步voID方法的 *** 作时需要延迟,该方法必须在返回之前完成.这种“事件”实际上是一种命令.例如,“鼠标移动”只是一个事件 – 系统不关心你是否处理事件.但是“suspend”是一个命令 – 系统假定当你从命令返回时,你已经准备好被暂停了.在这种情况下,延迟是必要的,以通知系统,即使你正在返回,你还没有完成.

同样,如果您的后台任务具有Run的异步实现,则需要延迟.因为当Run返回时,你的后台任务被认为已经完成了,你需要一种方式来表明你还没有完成.

您可以通过GetDeferral方法的存在来判断事件处理程序是否支持此 *** 作.例如,Suspending支持延迟,因为SuspendingEventArgs具有SuspendingOperation属性,该属性具有GetDeferral方法.在后台任务场景中(即,你有一个异步voID Run),你可以在传递给Run的IBackgroundTaskInstance上调用GetDeferral.

您的SelectAContactForASlot示例返回Task,因此不需要延迟.

总结

以上是内存溢出为你收集整理的c# – 是否应该为任何异步 *** 作添加延迟?全部内容,希望文章能够帮你解决c# – 是否应该为任何异步 *** 作添加延迟?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1262975.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-08
下一篇2022-06-08

发表评论

登录后才能评论

评论列表(0条)

    保存