/// <summary> /// Waits for a signal to be raised. /// /// The handler \p fn will be called after one of the signals in the set /// is caught. /// </summary> /// <typeparam name="T">Type of the sigarg parameter passed to RaiseSignal().</typeparam> /// <param name="fn">Handler function to call.</param> public void AwaitSignalAsync <T>(AwaitSignalFnDelegate <T> fn) where T : class { YogiCore.SignalSetAwaitSignalAsyncFnDelegate wrapper = (ec, signal, sigargPtr, userarg) => { try { T obj = null; if (sigargPtr != IntPtr.Zero) { obj = (T)GCHandle.FromIntPtr(sigargPtr).Target; } fn(ErrorCodeToResult(ec), (Signals)signal, obj); } finally { GCHandle.FromIntPtr(userarg).Free(); } }; var wrapperHandle = GCHandle.Alloc(wrapper); try { var wrapperPtr = GCHandle.ToIntPtr(wrapperHandle); int res = YogiCore.YOGI_SignalSetAwaitSignalAsync(Handle, wrapper, wrapperPtr); CheckErrorCode(res); } catch { wrapperHandle.Free(); throw; } }
/// <summary> /// Waits for a signal to be raised. /// /// The handler fn will be called after one of the signals in the set /// is caught. /// </summary> /// <param name="fn">Handler function to call.</param> public void AwaitSignalAsync(AwaitSignalFnDelegate fn) { AwaitSignalAsync <object>((res, signal, sigarg) => { fn(res, signal); }); }