之前在asp.net 中 我是通过callcontext来实现线程内唯一的, 这里是官方给的文档中这样写的 不知道是不是线程内唯一,? ps:这是在startup.cs中写的
services.AddDbContext<MyDataContext>(options => options.UseSqlServer(connection));
在我理解下 AddScoped 是线程内创建一个。 下一次用到的时候 就不会创建了,AddTransient
是每次获取都会创建一个,, 不知道对不对, 然后如果我创建业务层的实例的话 是否应该用
AddScoped
这是我在github上研究别人的asp.net core项目的时候产生的疑惑,他这边是一个异步action
大概就是获取数据
[Route("/{page:int?}")]
[OutputCache(Profile = "default")]
public async Task<IActionResult> Index([FromRoute]int page = 0)
{
var posts = await _blog.GetPosts(_settings.Value.PostsPerPage, _settings.Value.PostsPerPage * page);
ViewData["Title"] = _manifest.Name;
ViewData["Description"] = _manifest.Description;
ViewData["prev"] = $"/{page + 1}/";
ViewData["next"] = $"/{(page <= 1 ? null : page - 1 + "/")}";
return View("~/Views/Blog/Index.cshtml", posts);
}
我疑惑的是 var posts = await _blog.GetPosts(_settings.Value.PostsPerPage, _settings.Value.PostsPerPage * page); 它这里使用了 await, 导致程序会等,
这句话执行完成后 才会 return view,
那么 它这里使用同步方法 不就可以了么 ,为什么还异步呢?
services.AddDbContext
有个 contextLifetime
参数,默认值是 ServiceLifetime.Scoped
,所以注册的 DbContext 默认是同一个请求内唯一(注:是同一个请求,不是同一个线程,使用异步时会发生线程切换,同一个请求会在多个线程中执行)await
会释放当前线程,等异步执行完成时从线程池中重新拿到一个线程继续执行,避免了当前线程的空等,提高了线程的利用率666