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;
}
}