我最近遇到过不少情况async
方法同步执行,但无论如何都会返回一个任务,因此可以等待它们,例如
public virtual Task CreateAsync(TUser user)
{
ThrowIfDisposed();
if (user == null) throw new ArgumentNullException("user");
Context.Save(user);
Context.Flush();
return Task.FromResult(0);
}
当然,最好将可能长时间运行的操作分派给线程并返回仍然活动的任务,以真正等待:
public virtual Task CreateAsync(TUser user)
{
ThrowIfDisposed();
if (user == null) throw new ArgumentNullException("user");
return Task.Run(() =>
{
Context.Save(user);
Context.Flush();
});
}
不过,我有些怀疑,仅仅剥离 TPL 线程并不是最安全的做法。对这两种不同模式有什么评论吗?
如果你的方法是同步的,你不应该返回Task
首先。只需创建一个传统的同步方法即可。
如果由于某种原因这是不可能的(例如,您实现了一些异步接口),则使用返回已完成的任务Task.FromResult
在这种情况下甚至更好Task.CompletedTask
(在.NET 4.6中添加)比使用要好得多Task.Run
在实施中:
public virtual Task CreateAsync(TUser user)
{
// ...
return Task.CompletedTask;
}
如果您的 API 的使用者非常关心Task
-返回方法不同步运行,他们可以使用Task.Run
自己去确定。
您应该记住,异步方法可能有相当多的同步部分(第一个等待之前的部分),即使它们最终确实以异步方式继续。您不能假设异步方法返回Task
无论如何,立即。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)