Signal
Пара владельца и имени сигнала с поддержкой await в C#.
Структура C#, хранящая объект-владелец Owner и имя сигнала Name. Конструктор Signal(owner, name) сохраняет эту пару; он не создаёт объявление сигнала в объекте. Signal реализует протокол await через GetAwaiter(): ожидание завершается при соответствующем сигнале владельца.
Например, сигнал ProcessFrame принадлежит EntityTree. Для ожидания используются живой владелец и точное имя из EntityTree.SignalName.ProcessFrame; default(Signal) с пустыми ссылками не является готовым объектом ожидания.
Signal не преобразуется в bool в C#. Наличие Owner само по себе не доказывает, что сигнал существует или уже был испущен. Для обработчиков, доступных как C#-события, применяйте обычную подписку на события.
Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Конструкторы1
SignalКонструктор
public Signal(ReckfellObject owner, StringName name);Сохраняет owner и оболочку name. Не объявляет новый сигнал, не подписывается на него и не запоминает уже произошедшие срабатывания. Для ожидания нужен живой владелец и существующий сигнал; имя можно проверить через owner.HasSignal(name). Сохраняется та же оболочка StringName: не освобождайте её до использования Signal.
| Имя | Тип | По умолчанию |
|---|---|---|
owner | ReckfellObject | — |
name | StringName | — |
ownerЖивой объект с нужным сигналом; Signal не владеет его нативным временем жизни.
nameТочное имя существующего сигнала, предпочтительно из SignalName. Новое объявление сигнала здесь не создаётся.
Свойства2
NameСвойство
public StringName Name { get; }Возвращает сохранённую оболочку имени сигнала. Это не проверка существования сигнала и не сведения о последнем срабатывании. У default(Signal) ссылка null. Имя заимствовано; не вызывайте Dispose на общей SignalName-константе или оболочке, пока она используется.
OwnerСвойство
public ReckfellObject Owner { get; }Возвращает сохранённую ссылку на владельца. Ссылка не гарантирует, что нативный объект ещё существует; при необходимости проверяйте ReckfellObject.IsInstanceValid. У default(Signal) ссылка null. Чтение не подписывает на сигнал и не передаёт владение объектом.
Методы1
GetAwaiterIAwaiter<Variant[]>
public IAwaiter<Variant[]> GetAwaiter();Создаёт новое ожидание и сразу подключает одноразовый обработчик к следующему срабатыванию сигнала. C# вызывает этот метод для await signal. Повторный GetAwaiter создаёт отдельное ожидание; уже произошедший сигнал не воспроизводится.
Результат — массив копий Variant-аргументов в порядке объявления сигнала. После чтения освободите элементы; у сигнала без аргументов массив пустой. WaitNextProcess в примере использует встроенный ProcessFrame и освобождает результат.
using System.Threading.Tasks;
using Reckfell;
public static class CallableSignalExamples
{
public static int Twice(int value)
{
var callback = Callable.From<int, int>(static number => number * 2);
using var argument = Variant.From(value);
using var result = callback.Call(argument);
return result.AsInt32();
}
public static void SetLabelLater(Label label, string text)
{
var callback = Callable.From<string>(value =>
{
if (ReckfellObject.IsInstanceValid(label)) label.Text = value;
});
using var argument = Variant.From(text);
callback.CallDeferred(argument);
}
public static async Task WaitNextProcess(EntityTree tree)
{
Variant[] arguments = await new Signal(tree, EntityTree.SignalName.ProcessFrame);
foreach (var argument in arguments) argument.Dispose();
}
}Нет параметра CancellationToken и автоматического завершения при удалении owner: такое ожидание может остаться незавершённым. Не размещайте обязательное освобождение ресурсов только после этого await. Для повторяемого обработчика с управляемой отпиской используйте обычные C#-события += и -=; см. сигналы C#.
IAwaiter<Variant[]>Новое ожидание следующего срабатывания с результатом Variant[]. Не подтверждает успешное подключение к неверному имени и не предоставляет автоматической отмены.