2016-02-24 66 views
3

因此,我开始将我的nHibernate网站转换为使用Dapper的概念证明。出现MVC 6异步操作

是我的工作

我的操作方法是正确的,现在的工作:

public IActionResult About() 
{ 
    ViewData["Message"] = "Your application description page."; 

    var invoice = invoiceRepo.GetInvoiceAsync(19992031); 
    var allInvoices = invoiceRepo.GetAllInvoicesAsync(); 

    var model = new Models.AboutModel 
    { 
     Invoice = invoice.Result, 
     AllInvoices = allInvoices.Result 
    }; 

    return View(model); 
} 

但后来我意识到/牢记,为了它是异步的,我需要有Task上行动,像这样:

public Task<IActionResult> About() 
{ 
    ViewData["Message"] = "Your application description page."; 

    var invoice = invoiceRepo.GetInvoiceAsync(19992031); 
    var allInvoices = invoiceRepo.GetAllInvoicesAsync(); 

    var model = new Models.AboutModel 
    { 
     Invoice = invoice.Result, 
     AllInvoices = allInvoices.Result 
    }; 

    return View(model); 
} 

但是,只要我这样做,它告诉我,我需要等待的东西。在我见过的所有例子中,它只是显示了这样的内容:

var result = await repo.Get(param); 

但是我已经在我的回购中“等待”了。

public async Task<Invoice> GetInvoiceAsync(int invoiceId) 
{ 
    const string query = "select InvoiceId, Name [InvoiceName] from dbo.Invoice where InvoiceId = @invoiceId"; 

    using (var conn = GetConnection()) 
    { 
     var dp = new DynamicParameters(); 
     dp.Add("@invoiceId", invoiceId); 

     await conn.OpenAsync(); 
     var invoiceResult = await conn.QueryAsync<Invoice>(query, dp, null, 30, CommandType.Text); 
     var invoice = invoiceResult.SingleOrDefault(); 

     return invoice; 
    } 
} 

public async Task<List<Invoice>> GetAllInvoicesAsync() 
{ 
    const string query = "select InvoiceId, Name [InvoiceName] from dbo.Invoice where SalesPeriodId >= 17"; 

    using (var conn = GetConnection()) 
    { 
     await conn.OpenAsync(); 
     var invoiceResult = await conn.QueryAsync<Invoice>(query, null, null, 30, CommandType.Text); 
     var invoices = invoiceResult.Take(1000).ToList(); 

     return invoices; 
    } 
} 

所以我切换到异步整点是能够返回时,两者都做我的电话的异步,然后合并在一起的结果。

如何更改我的控制器操作以异步执行此操作,同时拥有Task<IActionResult>?像这样:

public Task<IActionResult>About() {} 

更新:这是正确的吗?

public async Task<IActionResult> About() 
{ 
    ViewData["Message"] = "Your application description page."; 

    var invoice = invoiceRepo.GetInvoiceAsync(19992031); 
    var allInvoices = invoiceRepo.GetAllInvoicesAsync(); 

    var model = new Models.AboutModel 
    { 
     Invoice = await invoice, 
     AllInvoices = await allInvoices 
    }; 

    return View(model); 
} 

这是否会同时执行两个回购调用(并行)?

+2

几乎可以确定你想要'VAR模型=新Models.AboutModel { 发票=伺机发票, AllInvoices =等待allInvoices };' –

+0

@ganders:就在鸡蛋里挑骨头 - 它可能会更好,有'变种发票=等待invoiceRepo.GetInvoiceAsync(19992031);'和allInvoices'类似,因为这种方式称为'invoice'的变量实际上是指发票,而不是最终导致发票的任务。 –

回答

1

您也需要等待您的控制器。经验法则:永远不要说.Result,而是说await

您还应该声明您的操作方法为public async

更新:这将是异步调用您的存储库的正确方法。数据库调用应该并行进行,因为两个任务都是在等待任何事情之前启动的。您可以随时通过在DB方法的开始和结束处放置调试日志并看到您获得“start 1 start 2 end 1 end 2”或类似的内容而不是“start 1 end 1 start 2 end 2”来查看此内容您的查询相当慢。

+0

谢谢,请参阅上面的“更新”进行确认... – ganders