Mig*_*elo 4 c# async-await c#-5.0 asp.net-mvc-4 .net-4.5
为什么我的控制器在await声明后被处理?
public async Task<ViewResult> MyAction()
{
await Task.Yield();
// controller disposed at this point... why?
return this.View();
}
Run Code Online (Sandbox Code Playgroud)
我的控制器通过重写Dispose方法来使用它所处理的资源......但是使用async/await似乎打破了这一点,因为它在执行await语句后立即处理控制器...如何以异步方式配置资源/ await是否受支持?
编辑: dispose方法的callstack中的最后一个方法:
MyWebRole.dll!MyWebRole.Code.MyController.Dispose(bool disposing = true) Line 102 C#
System.Web.Mvc.dll!System.Web.Mvc.Controller.Dispose() + 0x25 bytes
System.Web.Mvc.dll!System.Web.Mvc.DefaultControllerFactory.ReleaseController(System.Web.Mvc.IController controller = {MyWebRole.Areas.App.Controllers.LongPollingController}) + 0x3e bytes
System.Web.Mvc.dll!System.Web.Mvc.MvcHandler.BeginProcessRequest.AnonymousMethod__5() + 0x70 bytes
System.Web.Mvc.dll!System.Web.Mvc.Async.AsyncResultWrapper.MakeVoidDelegate.AnonymousMethod__0() + 0x2d bytes
System.Web.Mvc.dll!System.Web.Mvc.Async.AsyncResultWrapper.BeginSynchronous<System.Web.Mvc.Async.AsyncVoid>.AnonymousMethod__7(System.IAsyncResult _ = {System.Web.Mvc.Async.SimpleAsyncResult}) + 0x2b bytes
System.Web.Mvc.dll!System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult<System.Web.Mvc.Async.AsyncVoid>.End() + 0x99 bytes
System.Web.Mvc.dll!System.Web.Mvc.Async.AsyncResultWrapper.End<System.Web.Mvc.Async.AsyncVoid>(System.IAsyncResult asyncResult = {System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult<System.Web.Mvc.Async.AsyncVoid>}, object tag = {object}) + 0x3c bytes
System.Web.Mvc.dll!System.Web.Mvc.Async.AsyncResultWrapper.End(System.IAsyncResult asyncResult = {System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult<System.Web.Mvc.Async.AsyncVoid>}, object tag = {object}) + 0x29 bytes
System.Web.Mvc.dll!System.Web.Mvc.MvcHandler.EndProcessRequest.AnonymousMethod__d() + 0x27 bytes
System.Web.Mvc.dll!System.Web.Mvc.SecurityUtil.GetCallInAppTrustThunk.AnonymousMethod__0(System.Action f = {Method = {System.Reflection.RuntimeMethodInfo}}) + 0x20 bytes
System.Web.Mvc.dll!System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(System.Action action = {Method = {System.Reflection.RuntimeMethodInfo}}) + 0x3e bytes
System.Web.Mvc.dll!System.Web.Mvc.MvcHandler.EndProcessRequest(System.IAsyncResult asyncResult = {System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult<System.Web.Mvc.Async.AsyncVoid>}) + 0x77 bytes
System.Web.Mvc.dll!System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(System.IAsyncResult result = {System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult<System.Web.Mvc.Async.AsyncVoid>}) + 0x27 bytes
Run Code Online (Sandbox Code Playgroud)
Dispose正在调用该方法disposing = true......这很糟糕.也许是个bug?
编辑2:我尝试了子类化,AsyncController但同样的情况发生了.
有什么工作吗?
问题中显示的调用堆栈来自MVC3而不是MVC4.不幸的是,MVC3不支持Task基于异步的调用.当您调用await时,任务可能很好地启动,但MVC3对此没有任何了解,所以它只是调用ToString()它并将其作为a返回ContentResult.
将Task在MVC4加入基于异步的支持,而事实上甚至不需要从派生AsyncController.所有ControllersMVC4都支持同步和Task基于异步.只有AsyncController在使用Async/Completed模式时才需要.
| 归档时间: |
|
| 查看次数: |
791 次 |
| 最近记录: |