예제 #1
0
        /// <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;
            }
        }
예제 #2
0
 /// <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); });
 }