Запуск BackgroundWorker в другом BackgroundWorker

Я пытаюсь выполнить в проекте задачу с очень интенсивным использованием БД. Вот пошаговое руководство:

Нам нужно выполнить поиск в нашей базе данных рабочих, которую мы назвали Locums, и найти одну для конкретной работы. Эта процедура начинается, когда мы решаем обработать x заданий. Итак, одним нажатием кнопки мы обрабатываем, используя метод ProcessJobBatch () . Однако этот метод обрабатывает только очень ограниченное количество локумов. Таким образом, для заполнения элемента управления планировщиком требуется менее 10 секунд. Теперь, когда обслужено ограниченное количество локумов, нам нужно запустить фоновую задачу для проверки остальных локумов. Их около 1250!

Итак, после завершения ProcessJobBatch () , BackgroundWorker , BackgroundWorkerMoreLocums , гаснет. Теперь этот работник в основном выполняет простой цикл: для каждой работы проходит все 1250 сотрудников. Это занимает слишком много времени. Мне нужно спланировать это, используя альтернативную стратегию, которую я не могу использовать с банкоматом, или мне нужно показать дополнительный индикатор выполнения для внутреннего цикла for-each.

Дополнительные пояснения: Мы импортируем партию заданий ( От 10 до 70) несколько раз в день. После того, как пакет импортирован, приложение инструктирует вошедшего в систему пользователя «Предпочтительно найти» эти вновь созданные задания. У пользователя уже есть список его любимых локумов (от 1 до 20). Он хочет в первую очередь распределить работы среди своих любимых. Это делается с помощью ProcessJobBatch () . Но есть два сценария, которые сразу же предотвращают поток:

  • Что, если определенные задания не выпадут из какой-нибудь любимый местоблюститель?
  • А что, если есть местоблюститель во всем БД, который может выполнять почти все работы, но раз уж он не фаворит?

Итак, в итоге я получаю сценарий сопоставления работы с каждым местоблюстителем.

Вопрос: Может ли второй BackgroundWorker работать в DoWork BackgroundWorker? Я неправильно выполняю второе сканирование?

Среда: 64-разрядная версия Windows 7 Pro, Visual Studio 2010, C #, .NET 4.0 и Windows Forms

    private void ButtonPreferenceFind_Click(object sender, EventArgs e) {
        if (LookUpBatches.EditValue != null) {
            JobBatch JobBatchSelected = DbContext.JobBatches.FirstOrDefault(job_batch=> job_batch.OID == LookUpBatches.EditValue.ToString());

            if (JobBatchSelected != null && JobBatchSelected.Jobs.Count(condition => condition.JobStatusID == 1) > 0) {
                if (XtraMessageBox.Show(String.Format("Are you sure to process {0} job(s)?", JobBatchSelected.Jobs.Count(condition => condition.JobStatusID == 1)), Text, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) {
                    ProcessJobBatch(JobBatchSelected);

                    IEnumerable<Job> SpecificJobs = from req_jobs in JobBatchSelected.Jobs
                                                                                    where req_jobs.JobStatusID == 1
                                                                                    select req_jobs;

                    ProgressBarControlPreferenceFinder.EditValue = 0;
                    ProgressBarControlPreferenceFinder.Properties.Minimum = 0;
                    ProgressBarControlPreferenceFinder.Properties.Maximum = SpecificJobs.Count() - 1;

                    BackgroundWorkerMoreLocums.RunWorkerAsync(SpecificJobs);

                } else {
                    LookUpBatches.Focus();
                }

            } else {
                XtraMessageBox.Show("Unable to retrieve the selected batch or the batch has no processable jobs.", Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                LookUpBatches.Focus();

            }

        } else {
            XtraMessageBox.Show("Select a batch first.", Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);                   
            LookUpBatches.Focus();

        }
    }

    #region Background Searching
    private void BackgroundWorkerMoreLocums_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) {
        try {
            e.Result = GetTableData(e.Argument);

        }
        catch (Exception ex) {
            XtraMessageBox.Show("Background Error: " + ex.Message, "Excite Engine 2", MessageBoxButtons.OK, MessageBoxIcon.Error);
            e.Result = ex;
        }
    }

    private void BackgroundWorkerMoreLocums_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) {
        // only display progress, do not assign it to grid          
        ProgressBarControlPreferenceFinder.Increment(e.ProgressPercentage);
    }

    private void BackgroundWorkerMoreLocums_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) {
        if (e.Result is DataTable) {
            //dataGridView1.DataSource = e.Result as DataTable;
        }
        else if (e.Result is Exception) {
        }
    }

    private DataTable GetTableData(Object JobList) {
        DataTable ResultDataTable = new DataTable();
        ResultDataTable.Columns.Add();


        IEnumerable<Job> JobBatchSelected = (IEnumerable<Job>)JobList;

        IEnumerable<Locum> LeftOverLocums = from lefties in DbContext.Locums
                                                                                //where SchedulerMatrixStorage.Resources.Items.Select(res => (long)res.Id).ToList().Contains(lefties.OID) == false
                                                                                select lefties;

        int NumOfJobsProcessed = 0;

        List<KeyValuePair<long, TemporaryPreferenceFindLocum>> AlreadyPrefferedLocums = new List<KeyValuePair<long, TemporaryPreferenceFindLocum>>();

        foreach (Job oneJob in JobBatchSelected) {

            foreach (Locum oneLocum in LeftOverLocums) {

                if (DbContext.Availabilities.Any(check => check.LocumID == oneLocum.OID && check.AvailableDate == oneJob.JobDate && check.AvailabilityStatusID == 1)) {
                    //This Locum can do this job

                    //Now check if he/she has been just alloted
                    if (AlreadyPrefferedLocums.Any(search => search.Key == oneLocum.OID && search.Value.JobDate == oneJob.JobDate) == false) {
                        //No? Cool!                     
                        //Add to the list to prevent double allocation
                        AlreadyPrefferedLocums.Add(new KeyValuePair<long, TemporaryPreferenceFindLocum>(oneJob.OID, new TemporaryPreferenceFindLocum(oneJob.JobDate, oneJob.OID, oneLocum.OID, oneLocum.FirstName + " " + oneLocum.LastName)));

                    }
                    else {
                        continue;

                    }

                }
                else {
                    //Not marked as Avaliable on the required job date...
                    continue;

                }

            }

            NumOfJobsProcessed++;
            BackgroundWorkerMoreLocums.ReportProgress((int)(NumOfJobsProcessed * 100F / (JobBatchSelected.Count() - 1)));
        }

        return ResultDataTable;
    }
    #endregion
5
задан Hassan Gulzar 9 March 2011 в 13:08
поделиться