首页 / C# / c# – 扩展方法不等同于直接调用
c# – 扩展方法不等同于直接调用
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 扩展方法不等同于直接调用,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1712字,纯文字阅读大概需要3分钟。
内容图文
我会说我拥有的以下两个代码片段是等效的,但它们不是.
以下工作正常:
var entry3 = Task.Run(async () => await entry2.GetMemberGroupsAsync(false)).WaitForResult().FirstOrDefault();
下面的代码,我刚刚将Task.Run.WaitForResult链移动到扩展方法,不起作用,但产生死锁:
var entry3 = entry2.GetMemberGroupsAsync(false).RunSynchronouslyAndReturnResult().FirstOrDefault();
public static T RunSynchronouslyAndReturnResult<T>(this Task<T> task)
{
return Task.Run(async () => await task).WaitForResult();
}
为什么这两个代码片段不相同?
为了完整起见,GetMemberGroupsAsync方法由Microsoft Azure Graph API提供,函数WaitForResult定义如下.据我所知,根据来电者的姓名或某事,它没有做任何不同的事情.像那样:
public static TResult WaitForResult<TResult>(this Task<TResult> task,
bool continueOnCapturedContext = false)
{
if (task == null)
{
throw new ArgumentNullException("task");
}
try
{
return PreventForDeadLocks(task, continueOnCapturedContext).Result;
}
catch (AggregateException ex)
{
if (ex.InnerExceptions.Count == 1)
{
throw ex.InnerExceptions[0];
}
throw;
}
}
public static async Task<TResult> PreventForDeadLocks<TResult>(this Task<TResult> task,
bool continueOnCapturedContext = false)
{
return await task.ConfigureAwait(continueOnCapturedContext: continueOnCapturedContext);
}
解决方法:
这里的区别在于您的任务开始的同步上下文.这里:
var entry3 = Task.Run(async () => await entry2.GetMemberGroupsAsync(false)).WaitForResult().FirstOrDefault();
在Task.Run调用中启动异步任务(我的意思是等待entry2.GetMemberGroupsAsync(false)),因此不会捕获UI同步上下文.但在这里:
var entry3 = entry2.GetMemberGroupsAsync(false).RunSynchronouslyAndReturnResult().FirstOrDefault();
您隐式在UI上下文中启动任务(entry2.GetMemberGroupsAsync(false)返回Task),因此捕获了UI同步上下文,并且您有死锁.
内容总结
以上是互联网集市为您收集整理的c# – 扩展方法不等同于直接调用全部内容,希望文章能够帮你解决c# – 扩展方法不等同于直接调用所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。