The OptimizerMultivariableFunction type exposes the following members.
An event that gets raised when the derivative of the function is evaluated. This event will be raised in whatever thread the derivative is evaluated in. If you override the EvaluateDerivative(Double, Boolean, OptimizerMultivariableFunctionResults, ITrackCalculationProgress) method, you should call this event.
An event that gets raised when the nominal function is evaluated. This event will be raised in whatever thread the nominal function run was. This should be called in the concrete Evaluate(Double, ITrackCalculationProgress) method.
An event that gets raised when a perturbed function is computed as part of the derivation of the derivative of the function. This event will be raised in whatever thread the function was evaluated in. This can be ignored if the concrete function computes its derivative analytically.