private void mainBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            DataViewerActionArgs actionArgs = (DataViewerActionArgs)e.Argument;
            DataActionEventArgs  eventArgs  = new DataActionEventArgs(actionArgs.Data);

            switch (actionArgs.Action)
            {
            case DataViewerAction.Load:
                OnLoadAsync(eventArgs);
                break;

            case DataViewerAction.Open:
                OnOpenAsync(eventArgs);
                break;

            case DataViewerAction.New:
                OnNewAsync(eventArgs);
                break;

            case DataViewerAction.Delete:
                OnDeleteAsync(eventArgs);
                break;
            }

            DataViewerActionResult result = new DataViewerActionResult(
                eventArgs.Data,
                actionArgs.StatusGuid,
                eventArgs.Cancelled,
                eventArgs.UserMessage,
                actionArgs.Action);

            e.Result = result;
        }
        private void runActionAsync(DataViewerAction action, object inputData)
        {
            if (!mainBackgroundWorker.IsBusy)
            {
                DataActionBeforeEventArgs beforeArgs = new DataActionBeforeEventArgs(inputData);
                switch (action)
                {
                case DataViewerAction.Load:
                    OnBeforeLoadAsync(beforeArgs);
                    break;

                case DataViewerAction.Open:
                    OnBeforeOpenAsync(beforeArgs);
                    break;

                case DataViewerAction.New:
                    OnBeforeNewAsync(beforeArgs);
                    break;

                case DataViewerAction.Delete:
                    OnBeforeDeleteAsync(beforeArgs);
                    break;
                }

                if (!beforeArgs.Cancel)
                {
                    DataViewerActionArgs args = new DataViewerActionArgs(
                        beforeArgs.Data,
                        beforeArgs.StatusGuid,
                        action);

                    mainBackgroundWorker.RunWorkerAsync(args);
                }
                else
                {
                    DataViewerActionResult result = new DataViewerActionResult(
                        beforeArgs.Data,
                        beforeArgs.StatusGuid,
                        true,
                        string.Empty,
                        action);

                    handleAfterDataAction(result);
                }
            }
        }
        private void mainBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            DataViewerActionResult result = (DataViewerActionResult)e.Result;

            if (e.Error != null)
            {
                // Throw on windows forms thread.
                Invoke(
                    (MethodInvoker) delegate()
                {
                    throw new Exception(
                        "An error occured while running the background worker.", e.Error);
                }
                    );
            }

            handleAfterDataAction(result);
        }
        private void handleAfterDataAction(DataViewerActionResult result)
        {
            DataActionAfterEventArgs eventArgs = new DataActionAfterEventArgs(
                result.StatusGuid, result.Cancelled, result.Data);

            switch (result.Action)
            {
            case DataViewerAction.Load:
                OnAfterLoadAsync(eventArgs);
                break;

            case DataViewerAction.Open:
                OnAfterOpenAsync(eventArgs);
                break;

            case DataViewerAction.New:
                OnAfterNewAsync(eventArgs);
                break;

            case DataViewerAction.Delete:
                OnAfterDeleteAsync(eventArgs);
                break;
            }
        }