public AsyncProcessorThread()
        {
            try
            {
                ID = GetNextIDToProcess();

                ProcDetails.SingleOrDefault(z => z.ID == ID).Begin();

                AsyncProcessorDetail fd = ProcDetails.SingleOrDefault(z => z.ID == ID);

                // Add a case statement for each of the processor classes you create
                switch (fd.ProcessorType)
                {
                case "ProcessorImportCsv":
                    ProcessorImportCsv ImportDataCSV = new ProcessorImportCsv(fd);
                    break;

                case "ProcessorImportXls":
                    ProcessorImportXls ImportDataXLS = new ProcessorImportXls(fd);
                    break;

                case "ProcessorImportJson":
                    ProcessorImportJson ImportDataJSON = new ProcessorImportJson(fd);
                    break;

                case "ProcessorImportXML":
                    ProcessorImportXml ImportDataXML = new ProcessorImportXml(fd);
                    break;

                case "ProcessorImportTable":
                    ProcessorImportTable ImportDataTable = new ProcessorImportTable(fd);
                    break;

                default:
                    ProcDetails.SingleOrDefault(z => z.ID == ID).StatusText = "No ProcessorType found. Exiting..";
                    ProcDetails.SingleOrDefault(z => z.ID == ID).End();
                    break;
                }
            }
            catch (Exception ex) { }
        }
    public static int StartAsyncProcess(AsyncProcessorDetail input_detail)
    {
        if (ProcDetails == null)
        {
            ProcDetails = new List <AsyncProcessorDetail>();
        }

        bool error = false;

        foreach (AsyncProcessorDetail detail in ProcDetails)
        {
            if (detail.ID == input_detail.ID)
            {
                // task is already being processed
                if (detail.Processing)
                {
                    error = true;
                }
            }
        }

        if (!error)
        {
            // removing any existing instances of this detail in the list
            ProcDetails.RemoveAll(z => z.ID == input_detail.ID);

            // Add the detail to the list
            ProcDetails.Add(input_detail);

            // Start processor thread
            Thread processorThread = new Thread(new ThreadStart(StartProcessorThread));
            processorThread.IsBackground = false;
            processorThread.Start();

            return(0);
        }
        else
        {
            return(1);
        }
    }
 public ProcessorImportXls(AsyncProcessorDetail processor_detail)
 {
     ProcessorDetail = processor_detail;
     Process();
 }