试图了解.net中的任务

时间:2013-12-19 15:29:34

标签: c# asp.net .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);
        }
    }
  }
}

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%确定你使用任务

的深度

1 个答案:

答案 0 :(得分:7)

除非ExecuteDataTable内置了异步版本,否则我建议不要使用任务。如果您必须使用Task.Factory.StartNewTask.Run来使其正常工作,那么您可能不会这样做,并且您在负载下的性能会比您让它保持同步更差。

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