内联函数是后台任务吗?

时间:2018-10-18 18:28:32

标签: vb.net function task background-process

我正在使用此函数(我称其为内联函数,因为我不知道它的通用名称是什么):

pd.DataFrame([[None, 'a'],['b', None]]) 

当我使用后台任务或FolderWatcher并在其中执行某些操作(例如引发事件)时,它会发生严重错误。

我想知道是否也可以在这里发生。

此内联函数如何运行?

它是否以无限循环运行?如果是的话,它在哪里停止发出信号?

并且可以使用AddHandler代替此内联函数吗?

谢谢。

这是声明Begin,Next和End之类的函数的方式:

Private Shared _fixationDataStream As FixationDataStream

Private Shared Sub CreateAndVisualizeSensitiveFilteredFixationsStream()
    _fixationDataStream = _host.Streams.CreateFixationDataStream()
    _fixationDataStream.Begin(Function(x, y, __)
                                  Debug.Print(vbLf & "Fixation started at X: {0}, Y: {1}", x, y)
                                  _fixationBeginTime = DateTime.Now
                              End Function).Data(Function(x, y, __)
                                                     Debug.Print("During fixation, currently at: X: {0}, Y: {1}", x, y)
                                                 End Function).[End](Function(x, y, __)
                                                                         Debug.Print("Fixation ended at X: {0}, Y: {1}", x, y)

                                                                         If _fixationBeginTime <> Nothing Then
                                                                             Console.ForegroundColor = ConsoleColor.Cyan
                                                                             Debug.Print("Fixation duration: {0}", DateTime.Now - _fixationBeginTime)
                                                                             Console.ForegroundColor = _defaultForegroundColor
                                                                         End If
                                                                     End Function)
End Sub

2 个答案:

答案 0 :(得分:1)

这是使用方法链接(称为流利语法)的,其中每个调用的方法都返回对象。仅通过此一个方法调用就很难确定您的代码将执行什么操作,但是它似乎始于名为_fixationDataStream的对象。该对象是未知的,因为您没有在代码中发布声明。该对象具有一个名为Begin的方法,该方法采用一个Action方法,您正在传递一个匿名函数。它会将对象返回给您,并且您正在为此调用Data方法。再次,您传递了一个匿名方法,并将该对象返回给您。最后,您正在调用另一个名为End的方法,其中您要传入一个匿名函数。

这就是您正在做的事情,但是如果没有更多源代码,就不可能描述它的实际工作。

要回答您的其他问题,它不是在无休止的循环中运行(可以,但很可能不是),不,您不能使用AddHandler,因为没有事件。

答案 1 :(得分:1)

如果您的例程具有正确的签名,则可以使用AddressOf代替内联lambda。考虑如下内容:

Sub BeginRoutine(ByVal x As Double, ByVal y As Double, ByVal z As Double)
    '...
End Sub

Sub DataRoutine(ByVal x As Double, ByVal y As Double, ByVal z As Double)
    '...
End Sub

Sub EndRoutine(ByVal x As Double, ByVal y As Double, ByVal z As Double)
    '...
End Sub

然后,您可以使用AddressOf来使委托传递给API,例如

_fixationDataStream.Begin(AddressOf BeginRoutine).Data(AddressOf DataRoutine).[End](AddressOf EndRoutine)

使用内联lambda还是使用AddressOf更好,取决于您的代码库。如果您只需要一次性完成,那么内联通常会更方便。另一方面,如果您需要在多个地方使用同一例程,那么AddressOf可能是一个更好的选择。