Они - в значительной степени то же - единственная разница - то, что переменная, которую Вы передаете как out
параметр, не должна быть инициализирована, но передача его как ref
параметр, это должно быть установлено на что-то.
int x;
Foo(out x); // OK
int y;
Foo(ref y); // Error: y should be initialized before calling the method
Ref
параметры для данных, которые могли бы быть изменены, out
, параметры для данных, это - дополнительный вывод для функции (например, int.TryParse
), которые уже используют возвращаемое значение для чего-то.
Вы хорошо сформулировали проблему. После того, как SCO вызывает Initialize, данные CMI должны быть немедленно доступны для SCO для выполнения последующих вызовов GetValue. Однако выполнение синхронных вызовов AJAX не рекомендуется, если в запросе есть зависание, он может заблокировать весь браузер до тех пор, пока запрос не вернется или не истечет время ожидания. Решение состоит в том, чтобы предварительно загрузить все необходимые данные перед загрузкой SCO. В нашей реализации SCORM Engine мы предварительно загружаем все данные (CMI и последовательность) при запуске проигрывателя, а затем используем фоновый процесс для периодической фиксации грязных данных по мере прохождения учащимся курса. Может быть немного сложно гарантировать, что все данные правильно сохраняются при работе с комбинациями возможных сценариев запуска и выхода из окна, но это ' s конечно возможно. Вам нужно избегать любых запросов к серверу из вызова SCORM API, поскольку SCO часто наводняют LMS большими пакетами вызовов. Выполнение запросов к серверу в рамках этих вызовов может серьезно ухудшить опыт учащегося и снизить производительность сервера.
Mike
Мы подошли к этой проблеме, поставив в очередь данные CMI в API при запуске SCO. Сначала мы переходим на страницу запуска, которая загружает данные CMI в очередь API, а затем страница запуска фактически запускает SCO. Когда SCO вызывает intialize, мы просто перемещаем данные в CMI.