Вот цитата из документации SAP по теме.
Добавление 2
... {CALLING meth} | {PERFORMING subr}ON END OF TASK
...
Если во время раздела программы регистрируется несколько процедур обратного вызова, они выполняются в неопределенном порядке, когда рабочий процесс изменяется при развертывании.
Для меня это означает, что они будут выполняться один за другим (по порядку), что, однако, не определено.Это будет означать, что ваша переменная всегда будет иметь значение 10.
Вы можете фактически отладить ее, чтобы увидеть, как она обрабатывается последовательно, когда вы ставите точку останова в методе task_finish
.Вот мой пример.
REPORT ZZZ.
CLASS lcl_main DEFINITION FINAL CREATE PRIVATE.
PUBLIC SECTION.
CLASS-METHODS:
main,
task_finish
IMPORTING
p_task TYPE clike.
PRIVATE SECTION.
CLASS-DATA:
gv_counter TYPE i.
CLASS-METHODS:
start_tasks.
ENDCLASS.
CLASS lcl_main IMPLEMENTATION.
METHOD main.
start_tasks( ).
ENDMETHOD.
METHOD start_tasks.
DATA: l_task TYPE string.
DO 10 TIMES.
l_task = sy-index.
CALL FUNCTION 'Z_ARFC_ECHO'
STARTING NEW TASK l_task
CALLING task_finish ON END OF TASK
EXPORTING
i_value = sy-index.
ENDDO.
WAIT FOR ASYNCHRONOUS TASKS UNTIL gv_counter = 10.
ENDMETHOD.
METHOD task_finish.
DATA: l_value TYPE sy-index.
RECEIVE RESULTS FROM FUNCTION 'Z_ARFC_ECHO'
IMPORTING
e_echo = l_value.
WRITE: /, p_task, l_value.
gv_counter = gv_counter + 1.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
lcl_main=>main( ).
Мой RFC выглядит следующим образом
FUNCTION Z_ARFC_ECHO.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*" IMPORTING
*" VALUE(I_VALUE) TYPE SY-INDEX
*" EXPORTING
*" VALUE(E_ECHO) TYPE SY-INDEX
*"----------------------------------------------------------------------
e_echo = i_value.
ENDFUNCTION.
Что также интересно (и также упомянуто в документации), операторы вывода списка типа WRITE
не являютсяобрабатывается в таком обработчике, поэтому вы не видите ничего распечатываемого в конце выполнения вышеупомянутого отчета.