/// <summary>
        /// Asynchronously handles recognition results and forwards them to subscribers (e.g. SketchPanels)
        /// </summary>
        /// <param name="receipt">a receipt thrown once the result is available; the
        /// recognition result can be retrieved from this receipt</param>
        private void processRecognitionResult(IAsyncResult receipt)
        {
            // read result
            AsyncResult       asResult    = (AsyncResult)receipt;
            FireRecognition   frDelegate  = (FireRecognition)asResult.AsyncDelegate;
            RecognitionResult recogResult = frDelegate.EndInvoke(receipt);

            // publish result to panel
            RecognitionResultsEventHandler rrDelegate = new RecognitionResultsEventHandler(parentPanel.SetRecognitionResult);
//            parentPanel.Invoke(rrDelegate, new object[] { this, recogResult });
        }
        /// <summary>
        /// Handles recogntion trigger events.  Forwards recognition arguments to the real recognizer.
        /// </summary>
        /// <param name="source">The source panel of this trigger event</param>
        /// <param name="ra">The recognition arguments to forward (e.g., the sketch to be recognized)</param>
        private void panel_RecognitionTriggered(SketchPanel source, RecognitionArgs ra)
        {
            FireRecognition frDelegate = new FireRecognition(this.Recognize);

            frDelegate.BeginInvoke(ra, this.processRecognitionResult, null);
        }