Является ли встроенная функция фоновой задачей? - PullRequest
0 голосов
/ 18 октября 2018

Я использую эту функцию (я называю ее встроенной функцией, поскольку я не знаю, как ее обычно называют):

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

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Вы можете использовать AddressOf вместо встроенных лямбд, если у вас есть подпрограмма с правильной подписью.Рассмотрим что-то вроде следующего:

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)

Лучше ли использовать встроенные лямбды илиAddressOf зависит от вашей кодовой базы.Если все, что вам нужно, это однократные, то встроенный обычно удобнее.С другой стороны, если вам нужно будет использовать одну и ту же процедуру для более чем одного места, то AddressOf, вероятно, будет лучшим выбором.

0 голосов
/ 18 октября 2018

Это использует цепочку методов (так называемый свободный синтаксис), в которой каждый вызванный метод возвращает объект.Трудно точно понять, что делает ваш код только из этого одного вызова метода, но похоже, что он начинается с объекта с именем _fixationDataStream.Объект неизвестен, так как вы не разместили объявление в своем коде.У объекта есть метод с именем Begin, который принимает метод Action, который вы передаете анонимной функции.Он возвращает объект обратно вам, и вы вызываете метод Data для этого.Опять же, вы передаете анонимный метод, и он возвращает вам этот объект.Наконец, вы вызываете другой метод с именем End, в котором вы передаете анонимную функцию.

Это то, что вы делаете, но описать, что он на самом деле делает, невозможно без дополнительного исходного кода.

Чтобы ответить на ваши другие вопросы, он не работает в бесконечном цикле (ну, может быть, но, скорее всего, нет), и нет, вы не можете использовать AddHandler, потому что нет событий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...