线程错误,第二次操作开始

时间:2015-10-05 14:43:43

标签: asp.net-mvc vb.net multithreading asynchronous

我使用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

我第一次通过动作时没有收到此错误。如果用户查看一个项目的历史记录,则导航到主菜单并返回到另一个项目的历史记录。当用户第二次尝试查看项目的历史记录时,我遇到此错误。

我是否遗漏了在操作结束时关闭或重置线程的内容,或者您​​是否可以从我的实现中看到会导致这种情况的原因?

0 个答案:

没有答案