Linq to Sql приводит к асинхронному списку - PullRequest
2 голосов
/ 21 сентября 2011

Я разрабатываю приложение winform и сделаю запрос в базу данных и запишу свой комбобокс асинхронно, но у меня проблема с контролем доступа, потому что они приходят из другого потока, вот код.

   this.backWorker.DoWork + = delegate
             {
                 comboBoxUsers.DataSource = repositoryUser.SelectAll();
                 comboBoxUsers.ValueMember = "UserId";
                 comboBoxUsers.DisplayMember = "Name";
             };

             backWorker.RunWorkerAsync ();

Я изучаю envoke, но у меня возникают проблемы с реализацией этого, мне нужно было оставить видимую полосу прогресса события DoWork и выбрать для этого.

Ответы [ 2 ]

3 голосов
/ 21 сентября 2011

Запросите ваш репозиторий только в BackgroundWorker и верните результаты через ProgressChangedEvenHandler в пользовательский интерфейс

   //Set the ComboBox Properties on the Form, not in the worker.
   comboBoxUsers.ValueMember = "UserId";
   comboBoxUsers.DisplayMember = "Name";

   BackgroundWorker = new BackgroundWorker();
   worker.DoWork += Worker_DoWork;
   worker.WorkerReportsProgress = true;
   worker.ProgressChanged += new ProgressChangedEventHandler(Worker_ProgressChanged);

   private void Worker_DoWork(object sender, DoWorkEventArgs e)
   {
        BackgrounderWorker worker = (BackgroundWorker)sender;

        //Query the database
        //Instantiate a custom-class to contain the results
        IList<Users> users = userRepository.SelectAll();
        QueryResults results = new QueryResults(users);
        worker.ReportProgress(0, results);
   }

   //Back In the UI Layer
   private void Worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
   {
       var result = (QueryResult)e.UserState;
       comboBoxUsers.DataSource = result.Users;
   }
0 голосов
/ 21 сентября 2011

ваш делегат должен быть написан так:

this.backWorker.DoWork += delegate(object s, DoWorkEventArgs args)
{
  //...
}

Подробнее о том, как получить доступ к элементам управления пользовательского интерфейса потока из другого потока, см. Здесь:

Доступ к элементу управления Windowsот Backgroundworker DoWork

есть четкий ответ по этой ссылке, здесь фрагмент:

this.Invoke(new MethodInvoker(delegate {

  // This code executes on the GUI thread.

}));
...