C# 试图理解.net中的任务
好吧,我一直在处理.NET4.5中的任务,我试图让我的头脑了解所有事情,所以我创建了一个小应用程序,可以做一些工作,我有一些问题 代码如下: 账户控制员:C# 试图理解.net中的任务,c#,asp.net,.net,C#,Asp.net,.net,好吧,我一直在处理.NET4.5中的任务,我试图让我的头脑了解所有事情,所以我创建了一个小应用程序,可以做一些工作,我有一些问题 代码如下: 账户控制员: namespace MvcApplication1.Controllers { public class AccountController : Controller { private readonly UserManager _manager; public AccountControll
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);
}
}
}
}
IDBContext.cs
public interface IDBContext
{
DataTable ExecuteDataTable(string sql, IEnumerable<SqlParameter> parameters);
}
公共接口IDBContext
{
DataTable ExecuteDataTable(字符串sql,IEnumerable参数);
}
所以我这里有几个问题
我是否必须在每个函数中创建UserQuery类的新实例?不确定是否需要同步锁定,仍然存在困惑
我需要将ID复制到localID吗?我担心调用函数时的作用域和引用更改,这在任何情况下都值得担心吗
用户查询是否也应该是任务
如果userquerys应该是Task
,那么返回数据表的DBContext也应该是Task
,那么.net是否有用于可任务sql调用的函数
我不能100%确定您对任务的处理深度,除非
ExecuteDataTable
内置了异步版本,我建议不要使用任务。如果您必须使用Task.Factory.StartNew
或Task.Run
使其工作,则您可能不应该这样做,并且在负载下的性能将比仅保持同步时更差
Task.Run
(和Task.Factory.StartNew
)只能在等待CPU受限的任务时使用ExecuteDataTable
是一个I/O操作,您正在等待数据库响应,无论您使用何种API与数据库对话,都可能会公开返回Task
的函数以及您可以等待的函数(并且您需要在第一次调用的调用链上一直等待)但是,如果它没有公开一个返回任务的函数,那么您应该按照正常方式执行。“net是否有用于可任务sql调用的函数”这取决于您使用什么进行sql调用?实体框架,ADO.NET,Linq2Sql,第三方?它们中的许多都有异步方法调用,但这取决于您使用的方法。新的SqlConnection(“连接字符串”)类将是ADO.NET
,是的。看看所有以Async
结尾的函数,比如,当您知道最低的函数将绑定CPU或者库公开异步函数时,才应该使用任务?除此之外,让它保持同步?正确,这是一般的经验法则。(假设库编写正确,并且他们没有像您一样通过在任务中包装同步函数来执行“假异步”。运行)好的,这很有意义。什么时候CPU受限有经验法则吗?我猜当你开始思考你可以在一个实例中使用线程时,就会出现这种情况,而只使用任务。任务是包装器,它们可能是,它们可能是,或者它们可能是。任务的要点是您可以编写三种不同样式的代码来处理这三种类型的异步代码,任务允许您使用一种代码样式来处理所有这三种类型的代码。在使用ASP.net时,您应该避免执行线程任务,但应使用其他两个任务来帮助扩展+1。实际上,我要说的是,一般来说,Task.Run
应该只用于从UI线程调用CPU绑定的代码。它实际上(几乎)在ASP.NET应用程序中根本没有位置(任何CPU绑定的代码都应该直接在请求线程上执行)。
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
}
}
}
public interface IDBContext
{
DataTable ExecuteDataTable(string sql, IEnumerable<SqlParameter> parameters);
}