/// <summary>
        /// Runs the activity.
        /// </summary>
        private void Run()
        {
            InstantMessagingCall.StateChanged += new EventHandler <CallStateChangedEventArgs>(this.HandleInstantMessageCallStateChanged);


            InstantMessagingCall.Flow.MessageReceived += new EventHandler <InstantMessageReceivedEventArgs>(this.Customer_MessageReceived);

            SendInstantMessageActivity sendIMActivity = new SendInstantMessageActivity(this.InstantMessagingCall, this.Prompt);

            Task <ActivityResult> SendIMTask = sendIMActivity.ExecuteAsync();

            SendIMTask.ContinueWith((task) =>
            {
                if (task.Exception == null)
                {
                    this.m_lastImReceivedTime = DateTime.Now;
                    m_timer.Start();
                }
                else
                {
                    if (m_tcs != null)
                    {
                        m_tcs.TrySetException(task.Exception);
                    }
                }
            });
        }
        /// <summary>
        /// Handles an event when timer is expired.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            TimeSpan  idleInterval = DateTime.Now - this.m_lastImReceivedTime;
            Exception ex           = null;

            if (idleInterval.Seconds >= this.SilenceTimeOut)
            {
                this.m_lastImReceivedTime = DateTime.Now;
                NoInputCount++;
                if (this.InstantMessagingCall.State != CallState.Terminated)
                {
                    SendInstantMessageActivity senIM      = new SendInstantMessageActivity(this.InstantMessagingCall, this.NoRecognitionPrompt);
                    Task <ActivityResult>      sendIMTask = senIM.ExecuteAsync();
                    sendIMTask.ContinueWith((task) =>
                    {
                        try
                        {
                            if (NoInputCount >= MaxSilenceCount)
                            {
                                this.m_timer.Stop();
                                if (!string.IsNullOrEmpty(this.EscalatedSilencePrompt))
                                {
                                    SendInstantMessageActivity sendIM          = new SendInstantMessageActivity(this.InstantMessagingCall, this.EscalatedSilencePrompt);
                                    Task <ActivityResult> sendEscalatedMessage = sendIM.ExecuteAsync();
                                    sendEscalatedMessage.Wait();
                                }
                                throw new SilenceTimeOutException("No Input from User");
                            }
                        }
                        catch (SilenceTimeOutException exception)
                        {
                            ex = exception;
                        }
                        catch (Exception exception)
                        {
                            ex = exception;
                        }
                        finally
                        {
                            if (ex != null)
                            {
                                this.UnRegisterEvents();
                                if (m_tcs != null)
                                {
                                    m_tcs.TrySetException(ex);
                                }
                            }
                        }
                    });
                }
            }
        }
        /// <summary>
        /// Function called when users input is not recognized againt expected inputs.
        /// </summary>
        protected void HandleNoRecognition()
        {
            Exception ex = null;
            SendInstantMessageActivity sendInstantMessage = new SendInstantMessageActivity(this.InstantMessagingCall, this.NoRecognitionPrompt);
            Task <ActivityResult>      sendNoRecoIMTask   = sendInstantMessage.ExecuteAsync();

            sendNoRecoIMTask.ContinueWith((task) =>
            {
                try
                {
                    this.NoRecoCount++;
                    if (this.NoRecoCount == this.MaxNoRecoAttempts)
                    {
                        this.m_timer.Stop();
                        if (!string.IsNullOrEmpty(this.EscalatedNoRecognitionPrompt))
                        {
                            SendInstantMessageActivity sendIM          = new SendInstantMessageActivity(this.InstantMessagingCall, this.EscalatedNoRecognitionPrompt);
                            Task <ActivityResult> sendEscalatedMessage = sendIM.ExecuteAsync();
                            sendEscalatedMessage.Wait();
                        }

                        throw new NoRecognitionException("NoRecognition");
                    }
                }
                catch (NoRecognitionException exception)
                {
                    ex = exception;
                }
                catch (Exception exception)
                {
                    ex = exception;
                }
                finally
                {
                    if (ex != null)
                    {
                        this.UnRegisterEvents();
                        if (m_tcs != null)
                        {
                            m_tcs.TrySetException(ex);
                        }
                    }
                }
            });
        }