内联函数是后台任务吗?
Is an inline function a background task?
我正在使用这个函数(我称它为内联函数,因为我不知道它的通用名称是什么):
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
当我使用后台任务或 FolderWatcher 并在其中执行某些操作(如引发事件)时,它会出错。
我想知道这里是否也会发生这种情况。
这个内联函数是如何运行的?
它是否运行 处于无限循环中?如果是,它从哪里得到停止信号?
是否可以使用 AddHandler 而不是这个内联函数?
谢谢。
Begin、Next 和 End 等函数的声明方式如下:
Namespace Tobii.Interaction
Public Class FixationDataStream
Inherits DataStreamBase(Of FixationDataBehavior, FixationData)
Public Sub New(fixationDataBehavior As FixationDataBehavior, hasSubscribersChanged As Action, enabled As Boolean)
Public Function Begin(action As Action(Of Double, Double, Double)) As FixationDataStream
Public Function [End](action As Action(Of Double, Double, Double)) As FixationDataStream
Public Function Data(action As Action(Of Double, Double, Double)) As FixationDataStream
End Class
End Namespace
这是使用方法链(称为流畅语法),其中每个方法都调用 returns 对象。仅通过这一个方法调用很难确定您的代码做了什么,但看起来它是从一个名为 _fixationDataStream
的对象开始的。该对象未知,因为您没有 post 代码中的声明。该对象有一个名为 Begin
的方法,它采用一个 Action
方法,您将其传递给一个匿名函数。它将对象返回给您,您正在调用 Data
方法。同样,您传递了一个匿名方法,它将该对象返回给您。最后,您正在调用另一个名为 End
的方法,您在其中传递了一个匿名函数。
这就是您正在做的事情,但是如果没有更多的源代码,就不可能描述它实际在做什么。
要回答你的其他问题,它不是 运行 无限循环(当然可能是,但很可能不是)而且不,你不能使用 AddHandler
因为没有事件。
如果您的例程具有正确的签名,则可以使用 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
可能是更好的选择。
我正在使用这个函数(我称它为内联函数,因为我不知道它的通用名称是什么):
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
当我使用后台任务或 FolderWatcher 并在其中执行某些操作(如引发事件)时,它会出错。
我想知道这里是否也会发生这种情况。
这个内联函数是如何运行的?
它是否运行 处于无限循环中?如果是,它从哪里得到停止信号?
是否可以使用 AddHandler 而不是这个内联函数?
谢谢。
Begin、Next 和 End 等函数的声明方式如下:
Namespace Tobii.Interaction
Public Class FixationDataStream
Inherits DataStreamBase(Of FixationDataBehavior, FixationData)
Public Sub New(fixationDataBehavior As FixationDataBehavior, hasSubscribersChanged As Action, enabled As Boolean)
Public Function Begin(action As Action(Of Double, Double, Double)) As FixationDataStream
Public Function [End](action As Action(Of Double, Double, Double)) As FixationDataStream
Public Function Data(action As Action(Of Double, Double, Double)) As FixationDataStream
End Class
End Namespace
这是使用方法链(称为流畅语法),其中每个方法都调用 returns 对象。仅通过这一个方法调用很难确定您的代码做了什么,但看起来它是从一个名为 _fixationDataStream
的对象开始的。该对象未知,因为您没有 post 代码中的声明。该对象有一个名为 Begin
的方法,它采用一个 Action
方法,您将其传递给一个匿名函数。它将对象返回给您,您正在调用 Data
方法。同样,您传递了一个匿名方法,它将该对象返回给您。最后,您正在调用另一个名为 End
的方法,您在其中传递了一个匿名函数。
这就是您正在做的事情,但是如果没有更多的源代码,就不可能描述它实际在做什么。
要回答你的其他问题,它不是 运行 无限循环(当然可能是,但很可能不是)而且不,你不能使用 AddHandler
因为没有事件。
如果您的例程具有正确的签名,则可以使用 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
可能是更好的选择。