好吧,我一直在乱搞.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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
用户管理器:
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));
}
}
}
Run Code Online (Sandbox Code Playgroud)
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
IDBContext.cs
public interface IDBContext
{
DataTable ExecuteDataTable(string sql, IEnumerable<SqlParameter> parameters);
}
Run Code Online (Sandbox Code Playgroud)
所以我在这里有几个问题.
我是否必须在每个函数中创建UserQuery类的新实例?不确定是否需要同步锁定,仍然在那里混淆.
我是否需要将ID复制到localID,我担心在调用函数时确定范围和引用更改,在任何情况下都要担心什么?
UserQueries应该也Task<UserProfile>一样吗?
如果UserQueries应该是Task<UserProfile>返回DataTable的DBContext Task<DataTable>,那么.net是否有Taskable sql调用的函数?
我不是100%确定你使用Task有多深
除非ExecuteDataTable内置了Async版本,否则我建议不要使用任务.如果你必须使用Task.Factory.StartNew或Task.Run使它工作,你可能不会这样做,你会在负载下获得比你让它保持同步更糟糕的性能.
Task.Run(和Task.Factory.StartNew)只应在等待CPU绑定的任务时使用.ExecuteDataTable是一个I/O操作,您正在等待数据库响应,无论您使用什么API与数据库通信,都可能会暴露返回的函数Task和您可以等待的函数(并且您需要await一直到您的链上调用第一个调用)但如果它没有公开一个返回a的函数,Task你应该按正常方式执行.
| 归档时间: |
|
| 查看次数: |
700 次 |
| 最近记录: |