Возможно вызвать синхронный метод асинхронно в MATLAB®. С некоторыми модификациями можно использовать
методы EndInvoke и Microsoft® BeginInvoke. Для получения дополнительной информации обратитесь к статье Calling Synchronous Methods Asynchronously MSDN®.
Можно использовать делегатов, чтобы вызвать синхронный метод асинхронно при помощи методов EndInvoke и BeginInvoke. Если поток, который инициирует асинхронный вызов, не должен быть потоком, который обрабатывает результаты, можно выполнить метод коллбэка, когда вызов завершается. Для получения информации об использовании метода коллбэка смотрите Вызов Метода Асинхронно Используя Коллбэк Когда Асинхронный Вызов Концы.
MATLAB является однопоточным приложением. Поэтому обработка асинхронных вызовов в среде MATLAB может привести к мертвым блокировкам.
Можно выполнить метод коллбэка, когда асинхронный вызов завершается. Метод коллбэка выполняется на различном потоке, чем поток, который обрабатывает результаты асинхронного вызова.
Следующее является обзором процедуры. Если вы не используете функцию обратного вызова, выполните процедуру в Вызове Метода Асинхронно Без Коллбэка.
Выберите или создайте функцию MATLAB, чтобы выполниться асинхронно.
Выберите или создайте делегата C# и сопоставьте его с функцией MATLAB.
Создайте функцию обратного вызова MATLAB с Системой. Делегат AsyncCallback подпись. Подпись, показанная в веб-сайте MSDN:
public delegate void AsyncCallback(IAsyncResult ar)
Используя код MATLAB, инициируйте асинхронный вызов с помощью метода BeginInvoke, задавая делегата коллбэка и при необходимости параметры объекта.
Продолжите выполнять команды в MATLAB.
Когда асинхронная функция завершается, MATLAB вызывает функцию обратного вызова, которая выполняет метод EndInvoke, чтобы получить результаты.
В этом примере создайте следующую функцию MATLAB, чтобы выполниться асинхронно:
function X = DivideFunction(A, B) if B ~= 0 X = A / B; else errid = 'MyID:DivideFunction:DivisionByZero'; error(errid, 'Division by 0 not allowed.') end end
Создайте следующую функцию MATLAB, которая выполняется как коллбэк, когда вызов асинхронного метода завершается. Эта функция отображает значение result метода EndInvoke.
function myCallback(asyncRes) result = asyncRes.AsyncDelegate.EndInvoke(asyncRes); disp(result) end
Используйте делегата del2Integer, заданного в блоке NetDocDelegate:
public delegate Int32 del2Integer(Int32 arg1, Int32 arg2);
Запустите пример:
% Create the delegate divDel = NetDocDelegate.del2Integer(@DivideFunction); A = 10; B = 5; % Initiate the asynchronous call. asyncRes = divDel.BeginInvoke(A,B,@myCallback,[]);
MATLAB отображает результат: 2
Следующее является обзором процедуры. Если вы хотите использовать функцию обратного вызова, выполните процедуру в Вызове Метода Асинхронно Используя Коллбэк Когда Асинхронный Вызов Концы.
Выберите или создайте функцию MATLAB, чтобы выполниться асинхронно.
Выберите или создайте делегата C# и сопоставьте его с функцией MATLAB.
В MATLAB инициируйте асинхронный вызов с помощью метода BeginInvoke.
Продолжите выполнять команды в MATLAB.
Опросите относительно асинхронного завершения вызова с помощью функции pause MATLAB.
Когда асинхронная функция завершится, вызовите метод EndInvoke, чтобы получить результаты.
В этом примере создайте следующую функцию MATLAB, myFunction:
% MATLAB function to execute asynchrounously function res = myFunction(strValue) res = strValue; end
Используйте делегата delString, заданного в блоке NetDocDelegate:
public delegate string delString(string message);
В MATLAB создайте делегата, myDelegate, задайте входные значения и запустите асинхронный вызов:
myDelegate = NetDocDelegate.delString(@myFunction);
A = 'Hello';
asyncRes = myDelegate.BeginInvoke(A,[],[]);
Метод BeginInvoke возвращает объект, asyncRes, который вы используете, чтобы контролировать прогресс асинхронного вызова. Опросите относительно результатов, с помощью функции pause MATLAB, чтобы позволить MATLAB обработать события:
while asyncRes.IsCompleted ~= true pause(0.01) end
Получите и отобразите результаты асинхронного вызова:
result = myDelegate.EndInvoke(asyncRes); disp(result)
Hello
Используя EndInvoke С и касательно Аргументов типаПодпись делегата MATLAB для EndInvoke следует специальным правилам отображения, если у вашего делегата есть аргументы типа ref или out. Для получения информации об отображении смотрите Делегатов.NET С и касательно Аргументов типа. Для примеров смотрите страницу с описанием EndInvoke.
Для MATLAB, чтобы обработать событие, которое выполняет коллбэк делегата на основном потоке, вызовите pause MATLAB (или подобное) функция.