好的,我一直在乱搞.net 4.5中的任务,我正试图解决所有事情,所以我创建了一个小应用程序做了一些工作,我有一些问题。
以下是代码:
Account 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);
}
}
}
}
User Manager.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));
}
}
}
UserQueries.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是否有可执行sql调用的函数?
我不能100%确定你使用任务
的深度答案 0 :(得分:7)
除非ExecuteDataTable
内置了异步版本,否则我建议不要使用任务。如果您必须使用Task.Factory.StartNew
或Task.Run
来使其正常工作,那么您可能不会这样做,并且您在负载下的性能会比您让它保持同步更差。
Task.Run
(和Task.Factory.StartNew
)只应在等待CPU绑定的任务时使用。 ExecuteDataTable
是一个I / O操作,您正在等待数据库响应,无论您使用哪个API与数据库通信,都可能会暴露返回Task
的函数以及您可以等待的函数(和您一样)需要await
一直调用你的第一个调用链接,但如果它没有公开一个返回Task
的函数,你应该按照正常的方式去做。