Возможно вызвать синхронный метод асинхронно в 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 (или подобное) функция.