Exemple #1
0
        //tests
        public static void TaskManagerSaveAndLoadTest(MainForm frm)
        {
            string        filename    = @"c:\tempObjectInstance\TestMgr1.xml";
            PFTaskManager taskManager = new PFTaskManager(PFTaskObjects.enTaskStorageType.XMLFiles, @"c:\tempObjectInstance\");

            try
            {
                _msg.Length = 0;
                _msg.Append("TaskManagerSaveAndLoadTest started ...\r\n");
                Program._messageLog.WriteLine(_msg.ToString());

                if (File.Exists(filename))
                {
                    File.Delete(filename);
                }

                for (int t = 1; t <= 5; t++)
                {
                    string taskName = "Task" + t.ToString("000");
                    PFTask task     = new PFTask(taskName);
                    task.MaxTaskHistoryEntries = 25;
                    task.TaskType  = enTaskType.WindowsExecutable;
                    task.FileToRun = @"c:\rundir\" + taskName + @".exe";
                    taskManager.TaskList.Add(task);
                }


                taskManager.SaveToXmlFile(filename);

                PFTaskManager taskMgr2 = PFTaskManager.LoadFromXmlFile(filename);

                _msg.Length = 0;
                _msg.Append(taskMgr2.ToXmlString());
                Program._messageLog.WriteLine(_msg.ToString());
            }
            catch (System.Exception ex)
            {
                _msg.Length = 0;
                _msg.Append(AppGlobals.AppMessages.FormatErrorMessage(ex));
                Program._messageLog.WriteLine(_msg.ToString());
                AppMessages.DisplayErrorMessage(_msg.ToString(), _saveErrorMessagesToAppLog);
            }
            finally
            {
                _msg.Length = 0;
                _msg.Append("\r\n... TaskManagerSaveAndLoadTest finished.");
                Program._messageLog.WriteLine(_msg.ToString());
            }
        }
Exemple #2
0
        public void GetTaskFromXml()
        {
            string taskName      = _frm.txtTaskName.Text.Trim();
            PFTask task          = null;
            string inputFileName = string.Empty;

            try
            {
                if (_frm.chkEraseOutputBeforeEachTest.Checked)
                {
                    Program._messageLog.Clear();
                }

                _frm._saveFilter           = "XML Files|*.xml|All Files|*.*";
                _frm._saveSelectionsFolder = _taskDefinitionsFolder;
                if (taskName.Length > 0)
                {
                    _frm._saveSelectionsFile = taskName + ".xml";
                }
                else
                {
                    _frm._saveSelectionsFile = string.Empty;
                }

                DialogResult res = _frm.ShowOpenFileDialog();
                if (res == DialogResult.OK)
                {
                    _frm.InitForm();
                    taskName = Path.GetFileNameWithoutExtension(_frm._saveSelectionsFile);
                    if (taskName.Length == 0)
                    {
                        _msg.Length = 0;
                        _msg.Append("You must specify a task name");
                        throw new System.Exception(_msg.ToString());
                    }

                    inputFileName = Path.Combine(_taskDefinitionsFolder, taskName + ".xml");

                    if (File.Exists(inputFileName) == false)
                    {
                        _msg.Length = 0;
                        _msg.Append("Unable to find file for specified task name: ");
                        _msg.Append(inputFileName);
                        throw new System.Exception(_msg.ToString());
                    }

                    task = PFTask.LoadFromXmlFile(inputFileName);

                    _frm.txtTaskName.Text          = task.TaskName;
                    _frm.txtTaskDescription.Text   = task.TaskDescription;
                    _frm.cboTaskType.Text          = task.TaskType.ToString();
                    _frm.txtMaxHistoryEntries.Text = task.MaxTaskHistoryEntries.ToString();
                    _frm.txtTaskSchedule.Text      = task.ScheduleName;
                    _frm.txtFileToRun.Text         = task.FileToRun;
                    _frm.txtWorkingDirectory.Text  = task.WorkingDirectory;
                    if (task.Arguments != null)
                    {
                        foreach (string s in task.Arguments)
                        {
                            if (s.Trim().Length > 0)
                            {
                                _frm.txtArguments.Text += s + Environment.NewLine;
                            }
                        }
                    }
                    _frm.cboWindowStyle.Text               = task.WindowStyle.ToString();
                    _frm.chkCreateNoWindow.Checked         = task.CreateNoWindow;
                    _frm.chkUseShellExecute.Checked        = task.UseShellExecute;
                    _frm.chkRedirectStandardOutput.Checked = task.RedirectStandardOutput;
                    _frm.chkRedirectStandardError.Checked  = task.RedirectStandardError;
                }
            }
            catch (System.Exception ex)
            {
                _msg.Length = 0;
                _msg.Append(AppGlobals.AppMessages.FormatErrorMessage(ex));
                Program._messageLog.WriteLine(_msg.ToString());
                AppMessages.DisplayErrorMessage(_msg.ToString(), _saveErrorMessagesToAppLog);
            }
            finally
            {
                ;
            }
        }
Exemple #3
0
        public void RunTask()
        {
            PFTask             task = new PFTask();
            PFTaskHistoryEntry the  = new PFTaskHistoryEntry();

            PFTimers.Stopwatch sw = new PFTimers.Stopwatch();
            string             connectionString = string.Empty;
            string             scheduleFolder   = string.Empty;
            string             scheduleName     = string.Empty;

            try
            {
                if (_frm.chkEraseOutputBeforeEachTest.Checked)
                {
                    Program._messageLog.Clear();
                }

                if (_frm.txtTaskName.Text.Trim().Length == 0 ||
                    _frm.txtFileToRun.Text.Trim().Length == 0)
                {
                    _msg.Length = 0;
                    _msg.Append("You must specify a the name and a file to run for RunTest");
                    throw new System.Exception(_msg.ToString());
                }

                sw.Start();

                _msg.Length = 0;
                _msg.Append("Before taskProcessor.Start");
                Program._messageLog.WriteLine(_msg.ToString());

                System.Diagnostics.Process p = Process.GetCurrentProcess();
                foreach (ProcessThread th in p.Threads)
                {
                    _msg.Length = 0;
                    _msg.Append("Thread ID: ");
                    _msg.Append(th.Id.ToString());
                    Program._messageLog.WriteLine(_msg.ToString());
                }

                scheduleFolder = _scheduleDefinitionsFolder;
                scheduleName   = Path.GetFileNameWithoutExtension(_frm.txtTaskSchedule.Text.Trim()) + ".xml";
                if (_frm.optUseXmlFiles.Checked)
                {
                    connectionString = Path.Combine(scheduleFolder, scheduleName);
                }
                else if (_frm.optUseDatabase.Checked)
                {
                    connectionString = _taskDefsDbConnectionString;
                }
                else
                {
                    _msg.Length = 0;
                    _msg.Append("You must select storage type: XML Files or Database.");
                    throw new System.Exception(_msg.ToString());
                }


                task.TaskName              = _frm.txtTaskName.Text;
                task.TaskDescription       = _frm.txtTaskDescription.Text;
                task.TaskType              = PFAppUtils.PFEnumProcessor.StringToEnum <enTaskType>(_frm.cboTaskType.Text);
                task.MaxTaskHistoryEntries = Convert.ToInt32(_frm.txtMaxHistoryEntries.Text);
                if (_frm.optUseXmlFiles.Checked)
                {
                    task.Schedule = PFSchedule.LoadFromXmlFile(connectionString);
                }
                else
                {
                    task.Schedule = PFSchedule.LoadFromDatabase(connectionString, _frm.txtTaskSchedule.Text.Trim());
                }
                task.FileToRun        = _frm.txtFileToRun.Text;
                task.WorkingDirectory = _frm.txtWorkingDirectory.Text;
                string[] lines = _frm.txtArguments.Lines;
                task.Arguments              = lines;
                task.WindowStyle            = PFAppUtils.PFEnumProcessor.StringToEnum <enWindowStyle>(_frm.cboWindowStyle.Text);
                task.CreateNoWindow         = _frm.chkCreateNoWindow.Checked;
                task.UseShellExecute        = _frm.chkUseShellExecute.Checked;
                task.RedirectStandardOutput = _frm.chkRedirectStandardOutput.Checked;
                task.RedirectStandardError  = _frm.chkRedirectStandardError.Checked;

                the.TaskID             = task.ID;
                the.TaskName           = task.TaskName;
                the.ScheduledStartTime = task.Schedule.GetCurrentScheduledDateTime(DateTime.Now, DateTime.Now.AddHours(1));

                PFTaskProcessor taskProcessor = new PFTaskProcessor(task);
                taskProcessor.Start();

                _msg.Length = 0;
                _msg.Append("After taskProcessor.Start");
                Program._messageLog.WriteLine(_msg.ToString());

                System.Diagnostics.Process p1 = Process.GetCurrentProcess();
                foreach (ProcessThread th in p1.Threads)
                {
                    _msg.Length = 0;
                    _msg.Append("Thread ID: ");
                    _msg.Append(th.Id.ToString());
                    Program._messageLog.WriteLine(_msg.ToString());
                }
                _msg.Length = 0;
                _msg.Append("Main thread id:    ");
                _msg.Append(System.Threading.Thread.CurrentThread.ManagedThreadId.ToString());
                Program._messageLog.WriteLine(_msg.ToString());
                _msg.Length = 0;
                _msg.Append("Spawned thread id: ");
                _msg.Append(taskProcessor.ThreadID.ToString());
                Program._messageLog.WriteLine(_msg.ToString());

                while (taskProcessor.HasFinished == false)
                {
                    System.Threading.Thread.Sleep(1000);
                    System.Threading.Thread.Yield();
                }


                sw.Stop();

                _msg.Length = 0;
                _msg.Append("Elapsed time: ");
                _msg.Append(sw.FormattedElapsedTime);
                Program._messageLog.WriteLine(_msg.ToString());

                _msg.Length = 0;
                _msg.Append("\r\nTaskProcessor property values: \r\n");
                _msg.Append("Curr Directory:  ");
                _msg.Append(task.WorkingDirectory);
                _msg.Append("\r\n");
                _msg.Append("Command Line:    ");
                _msg.Append(task.FileToRun);
                _msg.Append(" ");
                _msg.Append(PFTextProcessor.ConvertStringArrayToString(task.Arguments));
                _msg.Append("\r\n");
                _msg.Append("StartTime:       ");
                _msg.Append(taskProcessor.StartTime.ToString("MM/dd/yyyy HH:mm:ss"));
                _msg.Append("\r\n");
                _msg.Append("FinishTime       ");
                _msg.Append(taskProcessor.FinishTime.ToString("MM/dd/yyyy HH:mm:ss"));
                _msg.Append("\r\n");
                _msg.Append("Elapsed Time:    ");
                _msg.Append(taskProcessor.ElapsedTimeFormatted);
                _msg.Append("\r\n");
                _msg.Append("Exit Code:       ");
                _msg.Append(taskProcessor.ProcessExitCode.ToString());
                _msg.Append("\r\n");
                _msg.Append("OutputMessages:  ");
                _msg.Append(taskProcessor.OutputMessages);
                _msg.Append("\r\n");
                _msg.Append("ErrorMessages:   ");
                _msg.Append(taskProcessor.ErrorMessages);
                _msg.Append("\r\n");
                Program._messageLog.WriteLine(_msg.ToString());

                //fill up and save the history entry
                the.ActualStartTime    = taskProcessor.StartTime;
                the.ActualEndTime      = taskProcessor.FinishTime;
                the.TaskOutputMessages = taskProcessor.OutputMessages;
                the.TaskErrorMessages  = taskProcessor.ErrorMessages;
                the.TaskReturnCode     = taskProcessor.ProcessExitCode;
                if (taskProcessor.ProcessExitCode == 0)
                {
                    the.TaskRunResult = enTaskRunResult.Success;
                }
                else
                {
                    the.TaskRunResult = enTaskRunResult.Failure;
                }
                if (_frm.optUseXmlFiles.Checked)
                {
                    string theFilename = _taskHistoryFolder + the.TaskName + "_" + the.ActualEndTime.ToString("_yyyyMMdd_HHmmss") + ".xml";
                    if (File.Exists(theFilename))
                    {
                        File.Delete(theFilename);
                    }
                    the.SaveToXmlFile(theFilename);
                }
                else if (_frm.optUseDatabase.Checked)
                {
                    the.SaveToDatabase(_taskDefsDbConnectionString);
                }
                else
                {
                    _msg.Length = 0;
                    _msg.Append("You must specify whether to store the history in XML files or Database.");
                    throw new System.Exception(_msg.ToString());
                }
            }
            catch (System.Exception ex)
            {
                _msg.Length = 0;
                _msg.Append(AppGlobals.AppMessages.FormatErrorMessage(ex));
                Program._messageLog.WriteLine(_msg.ToString());
                AppMessages.DisplayErrorMessage(_msg.ToString(), _saveErrorMessagesToAppLog);
            }
            finally
            {
                ;
            }
        }
Exemple #4
0
        public void SaveTask()
        {
            string taskName       = _frm.txtTaskName.Text.Trim();
            PFTask task           = null;
            string outputFileName = string.Empty;


            try
            {
                if (_frm.chkEraseOutputBeforeEachTest.Checked)
                {
                    Program._messageLog.Clear();
                }

                if (taskName.Length == 0)
                {
                    _msg.Length = 0;
                    _msg.Append("You must specify a the name");
                    throw new System.Exception(_msg.ToString());
                }
                task = new PFTask(taskName);
                task.TaskDescription       = _frm.txtTaskDescription.Text;
                task.TaskType              = PFAppUtils.PFEnumProcessor.StringToEnum <enTaskType>(_frm.cboTaskType.Text);
                task.MaxTaskHistoryEntries = Convert.ToInt32(_frm.txtMaxHistoryEntries.Text);
                task.ScheduleName          = _frm.txtTaskSchedule.Text;
                task.FileToRun             = _frm.txtFileToRun.Text;
                task.WorkingDirectory      = _frm.txtWorkingDirectory.Text;
                string[] lines = _frm.txtArguments.Lines;

                task.Arguments              = lines;
                task.WindowStyle            = PFAppUtils.PFEnumProcessor.StringToEnum <enWindowStyle>(_frm.cboWindowStyle.Text);
                task.CreateNoWindow         = _frm.chkCreateNoWindow.Checked;
                task.UseShellExecute        = _frm.chkUseShellExecute.Checked;
                task.RedirectStandardOutput = _frm.chkRedirectStandardOutput.Checked;
                task.RedirectStandardError  = _frm.chkRedirectStandardError.Checked;


                outputFileName = Path.Combine(_taskDefinitionsFolder, taskName + ".xml");

                if (Directory.Exists(_taskDefinitionsFolder) == false)
                {
                    Directory.CreateDirectory(_taskDefinitionsFolder);
                }

                _msg.Length = 0;
                _msg.Append("Task ");
                _msg.Append(taskName);
                _msg.Append(" saved to ");
                if (_frm.optUseXmlFiles.Checked)
                {
                    task.SaveToXmlFile(outputFileName);
                    _msg.Append(outputFileName);
                }
                else
                {
                    task.SaveToDatabase(_frm._taskDefsDbConnectionString);
                    _msg.Append(_frm._taskDefsDbConnectionString);
                }
                Program._messageLog.WriteLine(_msg.ToString());
            }
            catch (System.Exception ex)
            {
                _msg.Length = 0;
                _msg.Append(AppGlobals.AppMessages.FormatErrorMessage(ex));
                Program._messageLog.WriteLine(_msg.ToString());
                AppMessages.DisplayErrorMessage(_msg.ToString(), _saveErrorMessagesToAppLog);
            }
            finally
            {
                ;
            }
        }
Exemple #5
0
        public void GetTaskFromDatabase()
        {
            string          taskName      = _frm.txtTaskName.Text.Trim();
            PFList <PFTask> taskList      = null;
            PFTask          task          = null;
            PFTaskManager   taskMgr       = new PFTaskManager(enTaskStorageType.Database, _taskDefsDbConnectionString);
            string          inputFileName = string.Empty;

            try
            {
                if (_frm.chkEraseOutputBeforeEachTest.Checked)
                {
                    Program._messageLog.Clear();
                }

                taskList = taskMgr.GetTaskList();
                NameListPrompt namesPrompt = new NameListPrompt();
                namesPrompt.lblSelect.Text = "Select the name from list below:";
                for (int i = 0; i < taskList.Count; i++)
                {
                    namesPrompt.lstNames.Items.Add(taskList[i].TaskName);
                }
                if (taskList.Count > 0)
                {
                    namesPrompt.lstNames.SelectedIndex = 0;
                }
                DialogResult res = namesPrompt.ShowDialog();
                if (res == DialogResult.OK)
                {
                    if (namesPrompt.lstNames.SelectedIndex == -1)
                    {
                        _msg.Length = 0;
                        _msg.Append("You did not select any task to load");
                        throw new System.Exception(_msg.ToString());
                    }
                    _frm.InitForm();
                    taskName = namesPrompt.lstNames.SelectedItem.ToString();
                    if (taskName.Length == 0)
                    {
                        _msg.Length = 0;
                        _msg.Append("You must specify a task name");
                        throw new System.Exception(_msg.ToString());
                    }

                    task = taskMgr.GetTaskByName(taskName);

                    if (task == null)
                    {
                        _msg.Length = 0;
                        _msg.Append("Unable to find task ");
                        _msg.Append(taskName);
                        _msg.Append(" in the database at ");
                        _msg.Append(_taskDefsDbConnectionString);
                        throw new System.Exception(_msg.ToString());
                    }

                    _frm.txtTaskName.Text          = task.TaskName;
                    _frm.txtTaskDescription.Text   = task.TaskDescription;
                    _frm.cboTaskType.Text          = task.TaskType.ToString();
                    _frm.txtMaxHistoryEntries.Text = task.MaxTaskHistoryEntries.ToString();
                    _frm.txtTaskSchedule.Text      = task.ScheduleName;
                    _frm.txtFileToRun.Text         = task.FileToRun;
                    _frm.txtWorkingDirectory.Text  = task.WorkingDirectory;
                    if (task.Arguments != null)
                    {
                        foreach (string s in task.Arguments)
                        {
                            if (s.Trim().Length > 0)
                            {
                                _frm.txtArguments.Text += s + Environment.NewLine;
                            }
                        }
                    }
                    _frm.cboWindowStyle.Text               = task.WindowStyle.ToString();
                    _frm.chkCreateNoWindow.Checked         = task.CreateNoWindow;
                    _frm.chkUseShellExecute.Checked        = task.UseShellExecute;
                    _frm.chkRedirectStandardOutput.Checked = task.RedirectStandardOutput;
                    _frm.chkRedirectStandardError.Checked  = task.RedirectStandardError;
                }
            }

            catch (System.Exception ex)
            {
                _msg.Length = 0;
                _msg.Append(AppGlobals.AppMessages.FormatErrorMessage(ex));
                Program._messageLog.WriteLine(_msg.ToString());
                AppMessages.DisplayErrorMessage(_msg.ToString(), _saveErrorMessagesToAppLog);
            }
            finally
            {
                ;
            }
        }
        private async Task <bool> TraverseTree(string root, int maxTasks)
        {
            string currentDir = root;

            using (var throttler = new SemaphoreSlim(maxTasks))
            {
                var postTaskTasks = new List <PFTask>();

                while (currentDir != null)
                {
                    if (currentDir == root)
                    {
                        // First time get the directories syncroniously to populate the DB with directories to run on
                        IEnumerable <string> directories = Directory.EnumerateDirectories(currentDir);
                        List <string>        lst         = new List <string>();

                        foreach (string dir in directories)
                        {
                            try
                            {
                                DirectoryInfo di = new DirectoryInfo(dir);
                                lst.Add(di.FullName);
                                Log.Trace("Added folder: " + di.FullName + ", Thread Id: " + Thread.CurrentThread.ManagedThreadId);
                            }
                            catch (Exception ex)
                            {
                                Log.Info(ex, "User doesn't have permissions to folder: " + dir);
                            }
                        }
                        //await SMBDal.BulkAddFolders(directories.ToList());
                        await SMBDal.BulkAddFolders(lst);
                    }
                    else
                    {
                        Log.Trace("Before wait: " + currentDir + ", wait: " + throttler.CurrentCount + ", Thread Id: " + Thread.CurrentThread.ManagedThreadId);
                        await throttler.WaitAsync();

                        Log.Trace("After wait: " + currentDir + ", wait: " + throttler.CurrentCount + ", Thread Id: " + Thread.CurrentThread.ManagedThreadId);
                        string value = currentDir.ToString();
                        PFTask t     = new PFTask();
                        t.Task = Task.Run(() => ProcessDir(value), t.CancellationToken).ContinueWith(tsk => release(throttler));
                        postTaskTasks.Add(t);
                        Log.Trace("After add task: " + currentDir + ", Thread Id: " + Thread.CurrentThread.ManagedThreadId);
                    }

                    // Fetch the next directory to traverse and do it again
                    currentDir = await SMBIterator.GetNextFolderForTraverse();

                    Log.Trace("GetNextFolderForTraverse returned: " + currentDir + ", Thread Id: " + Thread.CurrentThread.ManagedThreadId);

                    // Clean the completed tasks from the array
                    foreach (PFTask t in postTaskTasks)
                    {
                        if (t.Task.IsCompleted || t.Task.IsCanceled || t.Task.IsFaulted)
                        {
                            _tasksToRemove.Add(t);
                        }
                    }
                    foreach (PFTask t in _tasksToRemove)
                    {
                        postTaskTasks.Remove(t);
                    }
                    _tasksToRemove = new List <PFTask>();

                    if (currentDir == null)
                    {
                        Log.Trace("WaitAll" + ", Thread Id: " + Thread.CurrentThread.ManagedThreadId);
                        Task.WaitAll(postTaskTasks.Select(t => t.Task).ToArray());
                        currentDir = await SMBIterator.GetNextFolderForTraverse();

                        Log.Trace("Got directory after wait all: " + currentDir + ", Thread Id: " + Thread.CurrentThread.ManagedThreadId);
                    }
                }
            }

            return(true);
        }
        public async Task <bool> Scan(Repository repo)
        {
            bool   scanDone      = false;
            var    postTaskTasks = new List <PFTask>();
            object SpinLock      = new object();

            PrepCredentials(repo);
            using (var throttler = new SemaphoreSlim(_maxFilesScanCocur))
            {
                // Scan files
                while (!scanDone)
                {
                    bool semValue = await throttler.WaitAsync(_taskTimeout);

                    if (!semValue)
                    {
                        // See what tasks are hanging for more than 30 seconds and kill them
                        foreach (PFTask t in postTaskTasks)
                        {
                            if (t.StartTime.Subtract(DateTime.UtcNow).Seconds > _taskTimeout)
                            {
                                t.TokenSource.Cancel();
                            }
                        }
                    }

                    IteratorItem item = null;
                    lock (SpinLock)
                    {
                        // Get next item for iteration
                        item = SMBIterator.NextItem();
                    }

                    if (item != null)
                    {
                        // process the next item
                        PFTask tsk = new PFTask();
                        tsk.Task = Task.Run <ScanResult>(() => ScanNext(repo, item), tsk.CancellationToken).ContinueWith(t => release(throttler));
                        postTaskTasks.Add(tsk);
                    }
                    else
                    {
                        scanDone = true;
                    }

                    // Clean the completed tasks from the wait array
                    foreach (PFTask t in postTaskTasks)
                    {
                        if (t.Task.IsCompleted || t.Task.IsCanceled || t.Task.IsFaulted)
                        {
                            _tasksToRemove.Add(t);
                        }
                    }
                    foreach (PFTask t in _tasksToRemove)
                    {
                        postTaskTasks.Remove(t);
                        t.Task.Dispose();
                    }
                    _tasksToRemove = new List <PFTask>();

                    if (scanDone)
                    {
                        // Wait for all the tasks to finish before exiting
                        Task.WaitAll(postTaskTasks.Select(i => i.Task).ToArray(), 30000);
                    }
                }
            }
            Counter.PrintAll();
            return(true);
        }
Exemple #8
0
        public static void InitTaskProcessorTest(MainForm frm)
        {
            PFTask             task = new PFTask();
            PFTaskHistoryEntry the  = new PFTaskHistoryEntry();

            PFTimers.Stopwatch sw = new PFTimers.Stopwatch();

            try
            {
                _msg.Length = 0;
                _msg.Append("InitTaskProcessorTest started ...\r\n");
                Program._messageLog.WriteLine(_msg.ToString());


                sw.Start();

                _msg.Length = 0;
                _msg.Append("Before taskProcessor.Start");
                Program._messageLog.WriteLine(_msg.ToString());

                System.Diagnostics.Process p = Process.GetCurrentProcess();
                foreach (ProcessThread th in p.Threads)
                {
                    _msg.Length = 0;
                    _msg.Append("Thread ID: ");
                    _msg.Append(th.Id.ToString());
                    Program._messageLog.WriteLine(_msg.ToString());
                }

                task.TaskName              = "TestTask01";
                task.TaskDescription       = "Test the task for Testprog";
                task.TaskType              = enTaskType.WindowsExecutable;
                task.FileToRun             = @"C:\Temp\TestAppFolders\FilesToRun\testbat01.bat";
                task.WorkingDirectory      = @"C:\Temp\TestAppFolders\FilesToRun";
                task.MaxTaskHistoryEntries = 15;
                task.Schedule              = PFSchedule.LoadFromXmlFile(@"C:\ProFast\Projects\ScheduleFiles\TestWeeklyOccurs.xml");

                the.TaskID             = task.ID;
                the.TaskName           = task.TaskName;
                the.ScheduledStartTime = task.Schedule.GetCurrentScheduledDateTime(DateTime.Now, DateTime.Now.AddHours(1));

                PFTaskProcessor taskProcessor = new PFTaskProcessor(task);
                taskProcessor.Start();

                _msg.Length = 0;
                _msg.Append("After taskProcessor.Start");
                Program._messageLog.WriteLine(_msg.ToString());

                System.Diagnostics.Process p1 = Process.GetCurrentProcess();
                foreach (ProcessThread th in p1.Threads)
                {
                    _msg.Length = 0;
                    _msg.Append("Thread ID: ");
                    _msg.Append(th.Id.ToString());
                    Program._messageLog.WriteLine(_msg.ToString());
                }
                _msg.Length = 0;
                _msg.Append("Main thread id:    ");
                _msg.Append(System.Threading.Thread.CurrentThread.ManagedThreadId.ToString());
                Program._messageLog.WriteLine(_msg.ToString());
                _msg.Length = 0;
                _msg.Append("Spawned thread id: ");
                _msg.Append(taskProcessor.ThreadID.ToString());
                Program._messageLog.WriteLine(_msg.ToString());

                while (taskProcessor.HasFinished == false)
                {
                    System.Threading.Thread.Sleep(1000);
                    System.Threading.Thread.Yield();
                }


                sw.Stop();

                _msg.Length = 0;
                _msg.Append("Elapsed time: ");
                _msg.Append(sw.FormattedElapsedTime);
                Program._messageLog.WriteLine(_msg.ToString());

                _msg.Length = 0;
                _msg.Append("\r\nTaskProcessor property values: \r\n");
                _msg.Append("StartTime:       ");
                _msg.Append(taskProcessor.StartTime.ToString("MM/dd/yyyy HH:mm:ss"));
                _msg.Append("\r\n");
                _msg.Append("FinishTime       ");
                _msg.Append(taskProcessor.FinishTime.ToString("MM/dd/yyyy HH:mm:ss"));
                _msg.Append("\r\n");
                _msg.Append("Elapsed Time:    ");
                _msg.Append(taskProcessor.ElapsedTimeFormatted);
                _msg.Append("\r\n");
                _msg.Append("Exit Code:       ");
                _msg.Append(taskProcessor.ProcessExitCode.ToString());
                _msg.Append("\r\n");
                _msg.Append("OutputMessages:  ");
                _msg.Append(taskProcessor.OutputMessages);
                _msg.Append("\r\n");
                _msg.Append("ErrorMessages:   ");
                _msg.Append(taskProcessor.ErrorMessages);
                _msg.Append("\r\n");
                Program._messageLog.WriteLine(_msg.ToString());

                //fill up and save the history entry
                the.ActualStartTime    = taskProcessor.StartTime;
                the.ActualEndTime      = taskProcessor.FinishTime;
                the.TaskOutputMessages = taskProcessor.OutputMessages;
                the.TaskErrorMessages  = taskProcessor.ErrorMessages;
                the.TaskReturnCode     = taskProcessor.ProcessExitCode;
                if (taskProcessor.ProcessExitCode == 0)
                {
                    the.TaskRunResult = enTaskRunResult.Success;
                }
                else
                {
                    the.TaskRunResult = enTaskRunResult.Failure;
                }
                //string theFilename = @"c:\tempObjectInstance\" + the.TaskName + "_" + the.TaskID.ToString() + "_" + the.ActualEndTime.ToString("_yyyyMMdd_HHmmss") + ".txt";
                string theFilename = @"c:\tempObjectInstance\" + the.TaskName + "_" + the.ActualEndTime.ToString("_yyyyMMdd_HHmmss") + ".txt";
                if (File.Exists(theFilename))
                {
                    File.Delete(theFilename);
                }
                the.SaveToXmlFile(theFilename);
            }
            catch (System.Exception ex)
            {
                _msg.Length = 0;
                _msg.Append(AppGlobals.AppMessages.FormatErrorMessage(ex));
                Program._messageLog.WriteLine(_msg.ToString());
                AppMessages.DisplayErrorMessage(_msg.ToString(), _saveErrorMessagesToAppLog);
            }
            finally
            {
                _msg.Length = 0;
                _msg.Append("\r\n... InitTaskProcessorTest finished.");
                Program._messageLog.WriteLine(_msg.ToString());
            }
        }