Асинхронный вызов методов. NET

Как MATLAB обрабатывает асинхронные вызовы метода на.NET

Возможно вызвать синхронный метод асинхронно в 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)
    
  1. Используя код MATLAB, инициируйте асинхронный вызов с помощью метода BeginInvoke, задавая делегата обратного вызова и при необходимости параметры объекта.

  2. Продолжите выполнять команды в MATLAB.

  3. Когда асинхронная функция завершается, 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.

  1. В MATLAB инициируйте асинхронный вызов с помощью метода BeginInvoke.

  2. Продолжите выполнять команды в MATLAB.

  3. Опросите относительно асинхронного завершения вызова с помощью функции pause MATLAB.

  4. Когда асинхронная функция завершится, вызовите метод 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 (или подобное) функция.

Смотрите также

|

Внешние веб-сайты

Была ли эта тема полезной?