我使用VB.Net,Visual Studio 2013,MVC 5和EF6。我在code review上向我建议实现异步功能。我按照建议here宣布了我的所有任务Async
。我的解决方案中没有错误或警告,并且第一次通过异步操作时一切都按预期工作。但是,如果我稍后在同一会话中尝试使用相同的操作,则会遇到错误:
在上一次异步操作完成之前,在此上下文中启动了第二个操作。使用'等待'确保在调用此上下文中的另一个方法之前已完成任何异步操作。不保证任何实例成员都是线程安全的。
每次都会在不同的任务上抛出此错误。
这是我的控制器动作:
<SecureRoleByItemID>
<Route("ViewDetails/ViewHistory/{itemID:int}/{itemType:int}")>
Async Function ViewHistory(itemID As Integer, itemType As Integer) As Threading.Tasks.Task(Of ActionResult)
Dim viewModel = New ItemHistoryViewModel
Dim model = Await viewModel.getItemHistory(itemID, itemType)
Return View(model)
End Function
这是我创建视图模型的函数:
Async Function getItemHistory(itemID As Integer, itemTypeID As Integer) As Threading.Tasks.Task(Of ItemHistoryPresentationModel)
Dim returnModel = New ItemHistoryPresentationModel
Dim getOperatorsTask As Task(Of List(Of String)) = getOperatorsAsync(itemID)
Dim getItemNameTask As Task(Of String) = getItemNameAsync(itemTypeID)
Dim getChangeDatesTask As Task(Of List(Of Date)) = getChangeDatesAsync(itemID)
Dim getAssignedEmployeesTask As Task(Of List(Of String)) = getAssignedEmployeesAsync(itemID)
Dim getChangeTypesTask As Task(Of List(Of String)) = getChangeTypesAsync(itemID)
Dim getLocationIDsTask As Task(Of List(Of Long)) = getLocationIDsAsync(itemID)
Dim getEditHistoryIDsTask As Task(Of List(Of Integer?)) = getEditHistoryIDsAsync(itemID)
Await Task.WhenAll(getOperatorsTask, getItemNameTask, getChangeDatesTask, getAssignedEmployeesTask, getChangeTypesTask, _
getLocationIDsTask, getEditHistoryIDsTask)
returnModel.UniqueItemID = itemID
returnModel.ItemTypeID = itemTypeID
returnModel.ItemTypeString = getItemNameTask.Result
returnModel.DatesChanged = getChangeDatesTask.Result
returnModel.Operators = getOperatorsTask.Result
returnModel.AssignedEmployee = getAssignedEmployeesTask.Result
returnModel.ChangeType = getChangeTypesTask.Result
returnModel.LocationIDs = getLocationIDsTask.Result
returnModel.EditHistoryIDs = getEditHistoryIDsTask.Result
returnModel.LocationNames = getLocationNames(returnModel.LocationIDs)
returnModel.Edits = getEditHistoryValues(itemID, returnModel.EditHistoryIDs)
Return returnModel
End Function
这是抛出错误的最简单的任务:
Async Function getItemNameAsync(itemTypeID As Integer) As Task(Of String)
Dim itemName = Await (From row In db.tblCategories
Where row.Item_Type_Identifier = itemTypeID
Select row.Item_Type).SingleOrDefaultAsync()
Return itemName
End Function
我已经多次检查过每个函数是Async
并且正在使用Await
。
我第一次通过动作时没有收到此错误。如果用户查看一个项目的历史记录,则导航到主菜单并返回到另一个项目的历史记录。当用户第二次尝试查看项目的历史记录时,我遇到此错误。
我是否遗漏了在操作结束时关闭或重置线程的内容,或者您是否可以从我的实现中看到会导致这种情况的原因?