2016-08-31 5 views
0

Я использую thread с BackgroundWorker этим, приложение ждет долгое время для извлечения 50000 записей, это заставляет другую операцию ждать, пока этот поток не завершится. Как я могу избежать процесса ожидания при использовании вторичного потока.темы с BackgroudWorker, ждет долгое время. Как я могу избежать этого

private void btnExrtPDF_Click(object sender, RoutedEventArgs e) 
{ 
    if (DetailsOrSummary == "Details") 
     isDetails = true; 

    Dispatcher.BeginInvoke(DispatcherPriority.Input, new ThreadStart(() => 
    { 
     try 
     { 
      DetailReportFCBuySell = AlyexWCFService.DL.DLTTIn.FCBuySELL(
       transactionName, isDetails, 
       Convert.ToDateTime(dateEdtStartDate.EditValue).Date, 
       Convert.ToDateTime(dtpEditEndDate.EditValue).Date, 
       Customerid, ProductID, branchID, 
       NoOfRecords, PageIndex - 1, isBuy); 

      worker.RunWorkerAsync(); 
     } 
     catch 
     {    
      object obj = new object(); 
     } 
    })); 
} 

private void worker_DoWork(object sender, DoWorkEventArgs e) 
{   
    Dispatcher.Invoke(new Action(() => 
    { 
     System.Data.DataTable batchFCSB = new System.Data.DataTable(); 
     int row = 0; 

     if (DetailReportFCBuySell.FirstOrDefault().TotalRecords > toFetchRecords) 
     { 
      long RecordsIcrease = 1000; 
      batchFCSB = DetailReportFCBuySell.ToDataTable(); 
      //Collection.Add(row, batchFCSB); 
      row = 1; 
      PageIndex++; 

      for (long k = toFetchRecords; k < DetailReportFCBuySell.FirstOrDefault().TotalRecords; k = +toFetchRecords) 
      { 
       new AlxServiceClient().Using(channel => 
       { 
        ObservableCollection<DLReports.FCBuySellDetail> temp 
         = AlyexWCFService.DL.DLTTIn.FCBuySELL(
          transactionName, isDetails, 
          Convert.ToDateTime(dateEdtStartDate.EditValue).Date, 
          Convert.ToDateTime(dtpEditEndDate.EditValue).Date, 
          Customerid, ProductID, branchID, NoOfRecords, PageIndex - 1, isBuy); 

        DetailReportFCBuySell = DetailReportFCBuySell.Union(temp).ToObservableCollection(); 

        row++; 
        PageIndex++; 

       }); 
       toFetchRecords = toFetchRecords + RecordsIcrease; 
      } 
     } 
    }), DispatcherPriority.ContextIdle); 
} 
+1

Просто убедитесь, что обновление компонентов пользовательского интерфейса и управление наблюдаемой коллекцией выполняется в потоке пользовательского интерфейса. В настоящее время вы выполняете все в потоке пользовательского интерфейса. – WBuck

+0

s уже разрешено мной pblm, спасибо за помощь ур за помощь мне. –

ответ

-1

Так вы можете использовать фона рабочего.

Sample app

Добавить 2 кнопки на WinForm.

Первый btnStartWorker запускает фона рабочего.

В то время как btnStartWorker отключен и рабочий фон работает, btnДругое можно щелкнуть.

public partial class Form1 : Form 
{ 
    private delegate void ReenableDelegate(); 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private BackgroundWorker worker; 
    private void btnStartWorker_Click(object sender, EventArgs e) 
    { 
     btnStartWorker.Enabled = false; 

     worker = new BackgroundWorker(); 
     worker.DoWork += Worker_DoWork; 
     worker.RunWorkerCompleted += Worker_RunWorkerCompleted; 
     worker.RunWorkerAsync(); 
    } 

    private void Worker_DoWork(object sender, DoWorkEventArgs e) 
    { 

     Thread.Sleep(5000); // simulate long running operation here 
    } 

    private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     this.Invoke(new ReenableDelegate(Enable)); 
    } 

    private void Enable() 
    { 
     btnStartWorker.Enabled = true; 
    } 

    private void btnOther_Click(object sender, EventArgs e) 
    { 
     MessageBox.Show("Doing other stuff"); 
    } 
} 
+0

нет только одной задачи, этот метод я пробовал, но пользовательский интерфейс ждет некоторое время –

+0

, когда вы говорите, ожидая, вы имеете в виду блокирование? – robor78

+0

s, UI не будет работать, пока эта нить не завершится. Мне нужно работать с пользовательским интерфейсом, пока этот поток работает параллельно –

1

Ваш код совершенно неправ. Вы не должны иметь ни одного из этих вызовов до Dispatcher.BeginInvoke() или Dispatcher.Invoke(). Звонок на BeginInvoke() бессмысленен, он ничего не приносит ничего полезного, и последний заставляет всю работу выполнять фактически в потоке пользовательского интерфейса, а не в потоке рабочего фона, где он принадлежит.

Есть более современные подходы, которые вы можете использовать вместо BackgroundWorker, например await Task.Run(...). И без хорошего Minimal, Complete, and Verifiable code example невозможно предложить что-то более конкретное. Но поскольку код, который вы опубликовали, теперь стоит, если вы просто удалите все вызовы методам Dispatcher и сразу запустите вызываемый код, он должен работать так, как вы ожидаете.

+0

Если я удалю все вызовы диспетчера (он показывает, что вызывающий поток не может получить доступ к этому объекту, потому что ему принадлежит другой поток. »). (и еще одна вещь - это первый раз, когда я использую backgroundworker и thread в моем приложении, поэтому из примеров, показанных из stackOverflow, я так много делаю, сэр) –

+0

Без хорошего [mcve] я не могу сказать, что такое объект пользовательского интерфейса и что нет, и поэтому не может предоставить более конкретные рекомендации, чем указано выше. Это правда, что при доступе к объектам пользовательского интерфейса вам придется использовать 'Dispatcher.Invoke()' или аналогично этому. Но остальная часть кода должна работать в фоновом потоке; завершение задачи _entire_ в вызове 'Dispatcher.Invoke()' неверно и полностью отрицает точку использования «BackgroundWorker». –

+0

Вопрос, который вы задали здесь, о том, почему ваш «BackgroundWorker» работает, блокирует поток пользовательского интерфейса, и этот ответ адресован этому. Если после устранения этой проблемы вы по-прежнему не можете понять, как правильно обновлять объекты пользовательского интерфейса, отправьте новый вопрос, и на этот раз убедитесь, что вы включили хороший [mcve], который надежно воспроизводит проблему. –

 Смежные вопросы

  • Нет связанных вопросов^_^