Asp.net mvc 如何使用asp mvc 4异步控制器和EntityFramework 6从数据库异步读取从数据库获取数据
我有下一个控制器Asp.net mvc 如何使用asp mvc 4异步控制器和EntityFramework 6从数据库异步读取从数据库获取数据,asp.net-mvc,entity-framework,async-await,c#-5.0,Asp.net Mvc,Entity Framework,Async Await,C# 5.0,我有下一个控制器 public async Task<ActionResult> ImageAsync(int id) { var img = await _repository.GetImageAsync(id); if (img != null) { return File(img, "image/jpg"); //View(img); } byte[] res = new byte[0]; return File(
public async Task<ActionResult> ImageAsync(int id)
{
var img = await _repository.GetImageAsync(id);
if (img != null)
{
return File(img, "image/jpg"); //View(img);
}
byte[] res = new byte[0];
return File(res, "image/jpg");
}
当尝试以异步方式从数据库读取数据时,我的做法是错误的?对任务的属性结果的调用是一个阻塞调用,等待的继续将无法发布以运行
一旦您已经有了任务返回方法,为什么不直接使用wait呢
对任务的属性结果的调用是一个阻塞调用,等待的继续部分将无法发布以运行
一旦您已经有了任务返回方法,为什么不直接使用wait呢
这行代码的有趣之处在于它调用了SingleAsync,这是一种针对可观察对象的TAP扩展方法 我从未使用过将其集合公开为可观察的数据存储库,尽管我认为这是可能的。我的第一个猜测是,SingleAsync返回的任务没有完成,因为GoodImages observable没有完成。请注意,SingleAsync在看到匹配项后必须继续扫描,以确保它是唯一匹配项;FirstAsync更宽容,它会在看到第一个匹配时立即完成
另一方面,我建议使用wait而不是Result,并且不要使用Task.Run。因此,在这方面是好的,尽管在本例中,结果不会导致死锁。该行的有趣之处在于,它调用SingleAsync,这是一种用于可观察对象的TAP扩展方法 我从未使用过将其集合公开为可观察的数据存储库,尽管我认为这是可能的。我的第一个猜测是,SingleAsync返回的任务没有完成,因为GoodImages observable没有完成。请注意,SingleAsync在看到匹配项后必须继续扫描,以确保它是唯一匹配项;FirstAsync更宽容,它会在看到第一个匹配时立即完成
另一方面,我建议使用wait而不是Result,并且不要使用Task.Run。在这方面也是很好的,尽管在这种情况下,结果并不会导致僵局。有趣的是,同样的问题经常会让人困惑。每周至少10个问题。有趣的是,同样的问题经常会让人感到困惑。每周至少10个问题。我相信EF6通过像SingleAsync这样的扩展提供异步支持。Single和First有不同的意图,没有一个比另一个更好或更值得。根据你的意图,你应该知道何时使用其中一种。我相信EF6通过像SingleAsync这样的扩展提供了异步支持。Single和First有不同的意图,没有一个比另一个更好或更有价值。根据你的意图,你应该知道何时使用其中一种。
public async Task<byte[]> GetImage(int imageId)
{
try
{
var dbCtx = new smartbags_storeEntities();
var res = await dbCtx.GoodImages.SingleAsync(d => d.ImageId == imageId);
return res != null ? res.ImageData : null;
}
catch (Exception ex)
{
throw ex;
}
}
public async Task<byte[]> GetImageAsync(int imageId)
{
byte[] img = await Task.Run(() =>
{
var res = GetImage(imageId).Result;
if (res != null)
{
var wi = new System.Web.Helpers.WebImage(res);
wi.AddTextWatermark("info");
return wi.GetBytes();
}
return null;
});
return img;
}
var res = await dbCtx.GoodImages.SingleAsync(d => d.ImageId == imageId);
public async Task<byte[]> GetImageAsync(int imageId)
{
var res = await GetImage(imageId);
if (res != null)
{
var wi = new System.Web.Helpers.WebImage(res);
wi.AddTextWatermark("info");
return wi.GetBytes();
}
return null;
}