C# Linq到Sql在组合框异步中产生结果

C# Linq到Sql在组合框异步中产生结果,c#,winforms,linq-to-sql,C#,Winforms,Linq To Sql,我正在开发一个winform应用程序,会在数据库中发出请求并异步填充combobox,但由于它们来自另一个线程,所以存在访问控制问题,下面是代码 this.backWorker.DoWork + = delegate { comboBoxUsers.DataSource = repositoryUser.SelectAll(); comboBoxUsers.ValueMember = "UserI

我正在开发一个winform应用程序,会在数据库中发出请求并异步填充combobox,但由于它们来自另一个线程,所以存在访问控制问题,下面是代码

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

             backWorker.RunWorkerAsync ();
我正在研究envoke,但我在实施上遇到了困难,
我需要做的是让DoWork事件的进度栏保持可见,然后选择执行此操作。

您的委托应该这样写:

this.backWorker.DoWork += delegate(object s, DoWorkEventArgs args)
{
  //...
}
有关如何从另一个线程访问UI线程的UI控件的详细信息,请参见此处:

在这个链接上有一个明确的答案,这里有一个片段:

this.Invoke(new MethodInvoker(delegate {

  // This code executes on the GUI thread.

}));

仅在BackgroundWorker上查询您的存储库,并通过ProgressChangedEvenHandler将结果返回到UI

   //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;
   }
//在窗体上而不是在工作程序中设置组合框属性。
comboBoxUsers.ValueMember=“UserId”;
comboBoxUsers.DisplayMember=“Name”;
BackgroundWorker=新的BackgroundWorker();
worker.DoWork+=worker\u DoWork;
worker.WorkerReportsProgress=true;
worker.ProgressChanged+=新的progresschangedventhadler(worker\u ProgressChanged);
私有void Worker_DoWork(对象发送方,DoWorkEventArgs e)
{
BackgrounderWorker=(BackgroundWorker)发送方;
//查询数据库
//实例化自定义类以包含结果
IList users=userRepository.SelectAll();
QueryResults结果=新的QueryResults(用户);
worker.ReportProgress(0,结果);
}
//回到UI层
私有void Worker\u ProgressChanged(对象发送方,ProgressChangedEventArgs e)
{
var result=(QueryResult)e.UserState;
comboBoxUsers.DataSource=结果.Users;
}

不太明白,如何访问组合框?此外,如果组合框的ValueMember和DisplayMember永远不会更改,您可以在窗体的构造函数或关联的designer.cs文件本身中设置它们。您真正关心的唯一事情是将查询结果返回到主线程。