试图了解.net中的任务

dba*_*nes 7 .net c# asp.net

好吧,我一直在乱搞.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有多深

Sco*_*ain 7

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

Task.Run(和Task.Factory.StartNew)只应在等待CPU绑定的任务时使用.ExecuteDataTable是一个I/O操作,您正在等待数据库响应,无论您使用什么API与数据库通信,都可能会暴露返回的函数Task和您可以等待的函数(并且您需要await一直到您的链上调用第一个调用)但如果它没有公开一个返回a的函数,Task你应该按正常方式执行.