因此,我开始将我的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);
}
这是否会同时执行两个回购调用(并行)?
几乎可以确定你想要'VAR模型=新Models.AboutModel { 发票=伺机发票, AllInvoices =等待allInvoices };' –
@ganders:就在鸡蛋里挑骨头 - 它可能会更好,有'变种发票=等待invoiceRepo.GetInvoiceAsync(19992031);'和allInvoices'类似,因为这种方式称为'invoice'的变量实际上是指发票,而不是最终导致发票的任务。 –