public void SendCommand(MyParam param)
        {
            Console.WriteLine("Start Id:{0} T:{1}- IsThreadPool {2}", param.Id, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);

            ProcessingCommand += OnProcessingCommand;

            Func<RequestCommand, ResponseCompleteCommand> worker = (inFuncRequest) =>
            {
                Console.WriteLine("In Worker Id:{0} - T:{1} - IsThreadPool {2}", inFuncRequest.Id, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);

                Console.WriteLine("In Worker ... Calling Event Id:{0} T:{1} - IsThreadPool {2}", inFuncRequest.Id, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);

                OnProcessingCommand(this, new ResponseCompleteEvent { Id = inFuncRequest.Id, });

                return new ResponseCompleteCommand { Id = inFuncRequest.Id, };
            };

            Action<IAsyncResult> actionOnComplete = (requestInOnComplete) =>
            {
                Console.WriteLine("In actionOnComplete  T:{0} - - IsThreadPool {1}", Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);

                var asyncResult = (AsyncResult)requestInOnComplete;
                var asyncOperationInOnComplete = requestInOnComplete.AsyncState as AsyncOperation;
                var userStateInOnComplete = asyncOperationInOnComplete.UserSuppliedState as UserState;
                var myParam = userStateInOnComplete.MyParam;
                Console.WriteLine("In actionOnComplete Id:{0} T:{1}- IsThreadPool {2}", myParam.Id, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);

                var inlineWorker = asyncResult.AsyncDelegate as Func<RequestCommand, ResponseCompleteCommand>;

                Console.WriteLine("In actionOnComplete EndInvoke...  T:{0} - IsThreadPool {1}", Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);
                ResponseCompleteCommand commandResponse = worker.EndInvoke(requestInOnComplete);

                Console.WriteLine("In actionOnComplete EndInvoke... Done! param.Id:{0} == responseComplete.Id:{1} ==> {2} T:{3}",
                    myParam.Id,
                    commandResponse.Id,
                    myParam.Id == commandResponse.Id,
                    Thread.CurrentThread.ManagedThreadId);
            };

            AsyncOperation asyncOperation = AsyncOperationManager.CreateOperation(new UserState { MyParam = param, });
            var asyncCallback = new AsyncCallback(actionOnComplete);

            worker.BeginInvoke(new RequestCommand { Id = param.Id, }, asyncCallback, asyncOperation);

            Console.WriteLine("End Id:{0} T:{1}- IsThreadPool {2}", param.Id, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);

            //Console.WriteLine("*************************");

            //worker(new RequestCommand { Id = 999 });

            //Console.WriteLine("*************************");
        }
        static void Main(string[] args)
        {
            var myParam = new MyParam { Id = 1, };
            var basicCommandWithThreadId = new BasicCommandWithThreadId();

            var actions = System.Linq.Enumerable.Range(0, 20).Select(i => new { Id = i, ActionToInvoke = new Action(() => basicCommandWithThreadId.SendCommand(new MyParam { Id = i, })) });
            foreach (var a in actions)
            {
                Console.WriteLine("Starting {0}", a.Id);
                a.ActionToInvoke();
            }

            Console.ReadLine();
        }