【发布时间】:2016-03-04 11:45:33
【问题描述】:
我最近遇到了很多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 线程并不是最安全的做法。对这两种不同的模式有何评论?
【问题讨论】:
-
如果可能,您应该调用实际的异步方法,而不是其中任何一个。
-
@SLaks 第二个是不是异步的(除了不使用新关键字)? (来自不经常使用异步功能的人)
-
@KyleW:它仍然在浪费线程。见blog.slaks.net/2014-12-23/parallelism-async-threading-explained
-
@SLaks 好的,我明白你在说什么。最好
await Context.Save(user)并从那里开始。如果我们假设 Context.Save 是 3rd-party 并且我们不能在那里添加异步,我们的选择是什么?似乎在 OP 中给出的选项之外,阻塞当前线程的第一个比第二个差得多,后者至少将其分流到另一个线程并允许当前线程继续?
标签: c# multithreading asynchronous async-await task-parallel-library