【发布时间】:2015-09-11 16:50:56
【问题描述】:
我有一个返回 xml 字符串的异步方法。当我将任务添加到任务列表时,它会启动任务,但在使用 Entity Framework 与数据库对话时会挂起第一个等待。下面是示例代码。
public async Task<ActionResult> GenerateXml(long id)
{
var tasks = new List<Task<string>>();
tasks.Add(GenerateXmlAsync(id));
Task.WaitAll(tasks.ToArray());
}
private async Task<string> GenerateXmlAsync(long id)
{
using (var dbContext = new MyDatabaseContext())
{
var item = await dbContext.Items.FirstOrDefaultAsync(itm => itm.Id = id);
/* do some calculations, generate the xml... */
var xml = "<generated by code above>";
return xml;
}
}
使用 Azure 上的流式日志,我可以看到任务运行但从未通过 dbContext 异步方法。它会挂起有什么原因吗?
【问题讨论】:
-
连接问题...能调试一下吗?
-
如果我将
FirstOrDefaultAsync更改为FirstOrDefault并删除await,它可以正常工作。 -
Task.WaitAll是一个阻塞调用。您正在主动阻止呼叫。事实上,GenerateXml有 noawaits 这意味着它将同步执行,编译器会给你一个错误 -
@PanagiotisKanavos 是正确的。您正在使用
Task.WaitAll创建死锁。 UI 线程正在等待GenerateXmlAsync完成。GenerateXmlAsync正在等待 UI 线程返回到消息泵,以便它可以继续工作。
标签: c# entity-framework asynchronous