UsbUirt.Controller.DoLearn C# (CSharp) Method

DoLearn() private method

private DoLearn ( object state ) : void
state object
return void
        private void DoLearn(object state)
        {
            var learnState = state as LearnState;
            var outCode = new StringBuilder(4096);
            var userDataHandle = new GCHandle();
            IntPtr userDataPtr = IntPtr.Zero;

            try {
                userDataHandle = GCHandle.Alloc(learnState);
                userDataPtr = (IntPtr) userDataHandle;
                Exception error = null;

                if (false == UUIRTLearnIR(
                    _hDrvHandle,
                    (int) learnState.CodeFormat | (int) learnState.LearnCodeModifier,
                    outCode,
                    LearnCallbackProc,
                    userDataPtr,
                    learnState.AbortFlag,
                    learnState.ForcedFrequency, IntPtr.Zero, IntPtr.Zero)) {
                    try {
                        Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
                    }
                    catch (Exception ex) {
                        error = ex;
                    }
                }

                if (userDataHandle.IsAllocated) {
                    userDataHandle.Free();
                }

                LearnCompletedEventHandler temp = _learnCompleted;
                if (null != temp) {
                    temp(this, new LearnCompletedEventArgs(error, learnState.WasAborted, outCode.ToString(), learnState.UserState));
                }
            }
            finally {
                learnState.Dispose();
                object learnStatesKey = null == learnState.UserState ? this : state;
                _learnStates[learnStatesKey] = null;
            }
        }