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