dav*_*off 9 c# task async-await asp.net-mvc-4
我有一个非常基本的MVC控制器,只有一个动作:
public class HomeController : Controller
{
public ActionResult Index()
{
OpenConnection().Wait();
return View();
}
private async Task OpenConnection()
{
var synchronizationContext = SynchronizationContext.Current;
Debug.Assert(synchronizationContext != null);
using (
var connection =
new SqlConnection(
@"Data Source=(localdb)\ProjectsV12;Initial Catalog=Database1;Integrated Security=True;"))
{
await connection.OpenAsync(); // this always hangs up
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是常规操作(不是异步版本)无法执行异步方法.在我的情况下,OpenConnection()方法总是挂起等待connection.OpenAsync()行.
过了一段时间,我发现了两种使代码正常工作的方法.
使控制器的操作异步
public async Task<ActionResult> Index()
{
await OpenConnection();
return View();
}
Run Code Online (Sandbox Code Playgroud)或者允许异步执行而不捕获原始SychronizationContext - 为此:
await connection.OpenAsync();
用...来代替:
await connection.OpenAsync().ConfigureAwait(false);
所以,我的猜测是我最初的问题是在SynchronizationContext周围.但是SynchronizationContext.Current不是null,这让我想知道我的猜测是否正确.
那么,任何人都可以解释一下,为什么MVC控制器中的异步操作不能同步执行异步方法?
| 归档时间: |
|
| 查看次数: |
10777 次 |
| 最近记录: |