gpt4 book ai didi

c# - Task.FromResult() 与 Task.Run()

转载 作者:可可西里 更新时间:2023-11-01 03:07:46 27 4
gpt4 key购买 nike

我最近遇到了很多情况,其中 async 方法同步执行,但无论如何都会返回一个任务,因此可以等待它们,例如

public virtual Task CreateAsync(TUser user)
{
ThrowIfDisposed();
if (user == null) throw new ArgumentNullException("user");
Context.Save(user);
Context.Flush();
return Task.FromResult(0);
}

当然,最好将可能长时间运行的操作分派(dispatch)给线程并返回仍处于事件状态的任务,以便真正等待:

public virtual Task CreateAsync(TUser user)
{
ThrowIfDisposed();
if (user == null) throw new ArgumentNullException("user");
return Task.Run(() =>
{
Context.Save(user);
Context.Flush();
});
}

不过,我有些怀疑,仅仅分离 TPL 线程并不是最安全的做法。对这两种不同的模式有何评论?

最佳答案

如果你的方法是同步的,你不应该返回一个 Task 开始。只需创建一个传统的同步方法。

如果由于某种原因不可能(例如,您实现了一些异步接口(interface))使用 Task.FromResult 返回已完成的任务,或者在这种情况下更好 Task.CompletedTask(在 .NET 4.6 中添加)比在实现中使用 Task.Run 好得多:

public virtual Task CreateAsync(TUser user)
{
// ...
return Task.CompletedTask;
}

如果您的 API 的使用者非常关心 Task 返回方法未同步运行,他们可以使用 Task.Run 自己来确保。

您应该记住,异步方法可能有相当大的同步部分(第一个 await 之前的部分),即使它们最终确实以异步方式继续。 您不能假定异步方法无论如何都会立即返回一个Task

关于c# - Task.FromResult() 与 Task.Run(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34005397/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com