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;
}