异步函数MVC错误500

时间:2015-06-05 17:32:10

标签: vb.net asp.net-mvc-4

我试图理解异步方法概念,所以我做了一个返回视图的简单方法:

Public Async Function getPerfil() As Threading.Tasks.Task(Of ActionResult)
        Dim objOrganizacion As comOrganizacion.comOrganizacion = New comOrganizacion.comOrganizacion
        Dim ds As DataSet = Await Task.Run(objOrganizacion.GetUserPostulacion()) 
        Return View()
End Function

如果我从函数Dim ds As DataSet = Await Task.Run(objOrganizacion.GetUserPostulacion())中删除此行,那么该方法可以正常工作,我可以看到该视图。如果我不删除该行,我会得到:500 Internal Server Error

1 个答案:

答案 0 :(得分:0)

以下是MSDN的异步性编程指南: https://msdn.microsoft.com/en-us/library/hh191443.aspx

这是很多阅读,我可以通过经验来说很难掌握,因为我仍然试图自己完全掌握它。但是,如果您使用MVC的脚手架,包括使用Await的控制器中的函数,可能会有所帮助......

在调用Await [function]时,该函数返回一个Task。例如:Controller中的Async HttpPost函数包含“Await db.SaveChangesAsync()"”行。如果你去了SaveChangesAsync()的定义,这就是它所说的:

 Public Overridable Function SaveChangesAsync() As System.Threading.Tasks.Task(Of Integer)
 Member of System.Data.Entity.DbContext

 Summary:  Asynchronously saves all changes made in this context to the underlying database.

 Return Values:  A task that represents the asynchronous save operation.  The task result contains the number of objects written to the underlying database.

它使用的保存操作是SaveChanges,这是SaveChanges的定义:

 Public Overridable Function SaveChanges() As Integer
 Member of System.Data.Entity.DbContext

 Summary:  Saves all changes made in this context to the underlying database.

 Return Values:  The number of objects written to the underlying database.

所以基本上这意味着SaveChangesAsync对控制器函数做出PROMISE,以便在它拥有它之后返回它需要的东西。这就像使用中间人一样。假设您需要一个数字......而不是告诉NumberGetter“这就是我需要的”然后自己等待它,你告诉中间人“这就是我需要的”,然后他告诉NumberGetter你需要什么,并且自己等待它,以便在此期间你可以获得其他东西。

现在,在您的上下文中,您似乎想要进行此调用:

Dim ds As DataSet = Await objOrganizacion.GetUserPostulacionAsync()

其中objOrganizacion.GetUserPostulacionAsync()是一个返回Task(Of DataSet)的异步函数。它调用实​​际函数(GetUserPostulacion),它将返回您需要的DataSet。

无论如何,我希望有所帮助!