ASP.NET异步控制器和调用Sync();什么是“Sync()”?

时间:2010-08-06 00:06:35

标签: asp.net asp.net-mvc asynchronous httpcontext

Using an Asynchronous Controller in ASP.NET MVC使用BeginMethod / EndMethod模式部分引用了Sync()方法。它没有链接,我无法通过谷歌搜索找到它的文档,因为同步是一个常见的术语。有人能指出我的写作方向吗?

  

确保您有权访问   HttpContext.Current实例和   为了避免竞争条件,你可以   通过调用恢复HttpContext.Current   来自回调方法的Sync()。

2 个答案:

答案 0 :(得分:4)

当您通过从控制器操作中调用BeginXyz / EndXyz方法生成异步操作时,处理异步响应的线程不受ASP.NET的控制。因此,您无法从这些线程中触摸HttpContext,控制器实例或任何其他共享状态。调用Sync()方法基本上同步对请求的访问;它恢复HttpContext.Current并授予您访问触摸HttpContext,控制器等的权限,但仅限于Sync()调用的持续时间。 MVC Futures的RegisterTask()扩展方法试图使这更容易,因为你基本上将它委托给目标的Begin和End方法,而RegisterTask()帮助器将确保End线程在适当的同步上下文中执行。

如果您通过在控制器操作中调用XyzAsync / XyzCompleted方法来生成异步操作,则不必担心这一点,因为已完成的处理程序会自动在同步上下文中运行。

答案 1 :(得分:3)