gpt4 book ai didi

c# - 试图了解 .net 中的任务

转载 作者:太空狗 更新时间:2023-10-29 20:20:41 24 4
gpt4 key购买 nike

好吧,我一直在搞乱 .net 4.5 中的任务,我试图了解所有事情,所以我创建了一个小应用程序来完成一些工作,我对此有一些疑问。

代码如下:

账户 Controller .cs:

namespace MvcApplication1.Controllers
{
public class AccountController : Controller
{
private readonly UserManager _manager;

public AccountController()
{
_manager = new UserManager(ContextFactory.GetContext());
}

[HttpPost]
public async Task<ActionResult> Register(LoginModel model)
{
var user = await _manager.FindAsync(model.UserName);
if (user != null)
{
//do some work
}
else
{
ModelState.AddModelError("", "Cannot Find User");
return View(model);
}
}
}
}

用户管理器.cs:

 namespace MvcApplication1
{
public class UserManager
{
private readonly IDBContext _context;

public UserManager(IDBContext context)
{
_context = context;
}
public Task<UserProfile> FindAsync(string ID)
{
var queryHelper = new UserQueries(_context);
var localID = ID;

return Task.Factory.StartNew(() => queryHelper.GetProfile(localID));
}
}
}

用户查询.cs:

public class UserQueries
{
private readonly IDBContext _context;
public UserQueries(IDBContext context)
{
_context = context;
}

public UserProfile GetProfile(string ID){
DataTable dt = _context.ExecuteDataTable(...)
//do work with dt and return UserProfile
}
}
}

IDBContext.cs

public interface IDBContext
{
DataTable ExecuteDataTable(string sql, IEnumerable<SqlParameter> parameters);
}

所以我有几个问题。

我是否必须在每个函数中创建一个 UserQuery 类的新实例?不确定是否需要同步锁定,仍然困惑。

我是否需要将 ID 复制到 localID,我担心调用函数时作用域和引用发生变化,这在任何情况下都值得担心吗?

UserQueries 应该是 Task<UserProfile>还有吗?

如果 UserQueries 应该是 Task<UserProfile>返回 DataTable 的 DBContext 是否也应为 Task<DataTable> , .net 是否具有可调用 Taskable sql 的功能?

我不是 100% 确定你对 Task 的了解有多深

最佳答案

除非 ExecuteDataTable 内置了异步版本,否则我建议不要使用任务。如果你必须使用 Task.Factory.StartNewTask.Run 来让它工作,你可能不应该这样做,你会在负载下获得比你更差的性能只是让它保持同步。

Task.Run(和 Task.Factory.StartNew)应该只在等待 CPU 密集型任务时使用 . ExecuteDataTable 是一个 I/O 操作,您正在等待数据库响应,无论您使用什么 API 与数据库对话,都可能公开返回 Task 的函数,而那些您可以等待(并且您需要 await 从调用链一直到第一次调用)但是如果它没有公开返回 Task 的函数,您应该以正常方式进行。

关于c# - 试图了解 .net 中的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20685517/

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