Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, Serginio1, Вы писали:
S>>Ну сейчас сделано как итератор с MoveNext.
V>Сейчас при создании экземпляра асинхронного автомата обязательно создаётся делегат, а это дорого.
V>Теперь есть возможность не создавать этот делегат.
Ну как здесь пишут
https://habr.com/ru/post/260217/ возвращает он интерфейс IAsyncStateMachine с двумя методами
https://docs.microsoft.com/ru-ru/dotnet/api/system.runtime.compilerservices.iasyncstatemachine?view=net-5.0
MoveNext()
Перемещает конечный автомат в его следующее состояние.
SetStateMachine(IAsyncStateMachine)
Настраивает конечный автомат с размещенной в куче репликой.
Состояние то это класс. Кроме адреса функции нужно еще и ссылку на класс.
Хотя в Delphi для обмана Win Api и COM генерили методы заглушки где в регистр записывался this для Api, а для COM корректировалось смещение, так как интерфейсов много и для каждого интерфейса генерировалась своя тлб со ссылкой на интерфейс просто поле со смещением от реального this
В .Net так нельзя но сделать
public struct Merhod<T,Y>
{
public T obj;
public Func<Y> func
}
Пусть обзовут не делегатом и вызывают напрямую как метод объекта
Кстати можно посмотреть на селекторы
https://docs.microsoft.com/ru-ru/xamarin/ios/internals/architecture
Во-первых, необходимо предоставить способ доступа Objective-C к C#, который выполняется с помощью селекторов. Селектор — это сообщение, которое отправляется объекту или классу. Objective-C Это делается с помощью функций objc_msgSend . Дополнительные сведения об использовании селекторов см. в руководстве по средствам Objective-C выбора . Также должен быть способ предоставления управляемого кода Objective-C , который более сложен из-за того факта, что Objective-C нет ничего знать об управляемом коде. Чтобы обойти это, мы используем Registrars . Эти сведения более подробно описаны в следующем разделе.