2015-09-15 1 views
1

У меня есть эта форма, где я выполняю много операций над базой данных. Я собираю огромный список продуктов и поставщиков из базы данных. Теперь я могу успешно реализовать фоновый рабочий для списка продуктов, но я не могу получить список поставщиков в том же фоновом потоке.Как получить доступ к нескольким наборам данных в одном экземпляре рабочего стола

Это дает мне исключение для вызова. Можно ли получить несколько списков в одном фоновом потоке?

public void GetDetails() 
{ 
     BackgroundWorker worker = new BackgroundWorker(); 
     worker.DoWork += worker_DoWork;   
    worker.RunWorkerCompleted +=worker_RunWorkerCompleted; 
    IsBusy = true;  
    worker.RunWorkerAsync(); 
} 
    private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
      ObservableCollection Products = (ObservableCollection)e.Result; 
     foreach (var prod in Products) 
      { 
       this.Products.Add(prod); 
      } 
      IsBusy = false; 
    } 

     private void worker_DoWork(object sender, DoWorkEventArgs e) 
    { 
      ObservableCollection Products = new ObservableCollection();   

      ObservableCollection Supplier = new ObservableCollection(); 
      using (Genesis_DataDataContext dataDc = new Genesis_DataDataContext()) 
      { 
        foreach (tbl_Product thisProduct in dataDc.tbl_Products) 
        { 
         Products.Add(thisProduct); 
        } 
        //foreach (tbl_Supplier thisSupplier in dataDc.tbl_Suppliers) 
        //{ 
          // Suppliers.Add(thisSupplier); 
        //} 
       } 
     e.Result = Products; 
    } 
+2

Сообщение об ошибке и трассировка стека. –

+1

Пожалуйста, также разместите образец кода. Ответ на ваш вопрос «да», но мы можем помочь без дополнительной информации. –

+0

Это часть, где я извлекаю данные с помощью фонового рабочего –

ответ

1

Я не знаю, что ваш Genesis_DataDataContext() производит, но вы могли бы просто создать базовый класс, чтобы загрузить данные в:

class BasicClass { 

    public ObservableCollection Products { get; set; } 

    public ObservableCollection Suppliers { get; set; } 

} 

Теперь, когда что-то вроде что вы можете передать оба элемента данных обратно в один и тот же объект.

public void GetDetails2() 
    { 
     using (var worker = new BackgroundWorker()) 
     { 
      worker.WorkerReportsProgress = true; 
      worker.WorkerSupportsCancellation = true; 
      worker.DoWork += delegate (object s, DoWorkEventArgs e) 
      { 
       var w = (BackgroundWorker)s; 
       var bc = new BasicClass(); 
       bc.Products = new ObservableCollection(); 
       bc.Suppliers = new ObservableCollection(); 
       using (var dataDc = new Genesis_DataDataContext()) 
       { 
        // dbl_Products may use a Data Reader, so use an index. 
        // This may or may not produce an error, depending on how the Genesis_DataDataContext is designed. 
        for (int i = 0; i < dataDc.tbl_Products.Count; i++) { 
         w.ReportProgress(i + 1, dataDc.tbl_Products.Count); 
         var item = dataDc.tbl_Products[i]; 
         bc.Products.Add(item); 
        } 
        w.ReportProgress(-1, "On to Suppliers.") 
        // dbl_Products may use a Data Reader, so use an index. 
        // This may or may not produce an error, depending on how the Genesis_DataDataContext is designed. 
        for (int i = 0; i < dataDc.tbl_Suppliers.Count; i++) 
        { 
         w.ReportProgress(i + 1, dataDc.tbl_Suppliers.Count); 
         var item = dataDc.tbl_Suppliers[i]; 
         bc.Suppliers.Add(item); 
        } 
        e.Result = bc; 
       } 
      }; 
      worker.ProgressChanged += delegate (object s, ProgressChangedEventArgs e) 
      { 
       if (!worker.CancellationPending) 
       { 
        var index = e.ProgressPercentage; 
        var state = e.UserState.ToString(); 
        int total; 
        if (int.TryParse(state, out total)) 
        { 
         Console.WriteLine("{0} of {1}", index, total); 
        } else 
        { 
         Console.WriteLine(state); 
        } 
       } else 
       { 
        worker.CancelAsync(); 
       } 
      }; 
      worker.RunWorkerCompleted += delegate (object s, RunWorkerCompletedEventArgs e) 
      { 
       IsBusy = false; 
       if (e.Error == null) 
       { 
        var bc = e.Result as BasicClass; 
        foreach (var item in bc.Products) 
        { 
         this.Products.Add(item); 
        } 
        foreach (var item in bc.Suppliers) 
        { 
         this.Suppliers.Add(item); 
        } 
       } 
      }; 
      worker.RunWorkerAsync(); 
      IsBusy = worker.IsBusy; 
     } 

    } 

Я принимаю это IsBusy другая переменная вы создали. Я не уверен, что это такое.

+0

. Этот файл данных является автогенерированным файлом linq. Я получаю данные базы данных из этого контекста данных. –

+1

Эй, спасибо, сработало. –

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