我正在为Visual Basic中的机器人开发一些控制软件,我不能为我的生活找出为什么执行一个在Task
框架之外完美运行的过程不会当我尝试将其同时运行到其余代码时工作。我尝试使用TPL让某个程序在后台运行,同时允许用户并行使用GUI(目前,程序在执行此程序时冻结,并且不会再次激活,直到它结束了,这可能需要几个小时)。我通过查看其他问题无法解决的问题是,我的NullReferenceException发生在Task区域内,但是如果我不尝试将其同时运行到其他软件,那么异常永远不会,永远都会发生这是我使用的代码:
Dim taskSPME = Task(Of Boolean).Factory.StartNew(Function()
Return MainForm.startSPME((SPMEpanel.SPMECoordinates), SPMEpanel.WaitingTimes, SPMEpanel.WellVolumes, SPMEpanel.StirPosition, SPMEpanel.StirringSpeed, SPMEpanel.StirringRadius, SPMEpanel.HoverZ, SPMEpanel.GridScaling, SPMEpanel.IncrementWithin)
End Function)
Try
taskSPME.Wait()
MsgBox("Task return value: " & taskSPME.Result.ToString)
Catch ex As AggregateException
For Each fault In ex.InnerExceptions
If TypeOf (fault) Is InvalidOperationException Then
MsgBox("Invalid Operation Exception")
ElseIf TypeOf (fault) Is NullReferenceException Then
MsgBox("Null Reference Exception. " & fault.Message.ToString)
ElseIf TypeOf (fault) Is IO.FileNotFoundException Then
MsgBox("File not found Exception")
End If
Next
End Try
位于另一个名为startSPME()
的GUI类中的 MainForm
是一个运行正常的函数,如果没有从任何类型的并行/并发框架调用它,则返回一个布尔值。我尝试过使用Parallel.Invoke()
甚至是旧的ThreadPool
内容,而且它们都只是抛出相同的异常,恰好是NullReferenceException
,其中的错误消息是{{1} }}。我尝试在"Object reference not set to an instance of an object"
参数中执行简单的任务,例如StartNew()
,并且运行正常。进口是
MsgBox
有人可以告诉我,我忘记了什么吗? Imports System.Threading
Imports System.Threading.Tasks
Imports System.Threading.Thread
构造函数调用的任务是否有条件执行?比如,它不能位于另一个班级吗?最初,我甚至不想在我的任务上调用StartNew()
方法,因为我希望程序在机器人执行实验时返回GUI,但由于机器人没有任何反应,除非Wait()
函数不在并行任务代码之外,我不知道这里出了什么问题。