Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在单个后台工作程序实例中访问多个数据集合_C#_Wpf_Multithreading - Fatal编程技术网

C# 如何在单个后台工作程序实例中访问多个数据集合

C# 如何在单个后台工作程序实例中访问多个数据集合,c#,wpf,multithreading,C#,Wpf,Multithreading,我在这个表单中对数据库执行许多操作。我正在从数据库中获取大量的产品和供应商列表。现在我能够成功地实现产品列表的后台工作程序,但我无法在同一后台线程中获得供应商列表 它给了我调用异常。是否可以在单个后台线程中获取多个列表 public void GetDetails() { BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += worker_DoWork; work

我在这个表单中对数据库执行许多操作。我正在从数据库中获取大量的产品和供应商列表。现在我能够成功地实现产品列表的后台工作程序,但我无法在同一后台线程中获得供应商列表

它给了我调用异常。是否可以在单个后台线程中获取多个列表

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;
    }

我不知道您的Genesis\u datacontext()正在生成什么,但您可以创建一个基本类来加载数据:

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;
        }

    }
public void GetDetails2()
{
使用(var worker=new BackgroundWorker())
{
worker.WorkerReportsProgress=true;
worker.worker支持扫描单元=true;
worker.DoWork+=委托(对象s、doworkerEventArgs e)
{
var w=(后台工作人员)s;
var bc=新的基本类();
bc.Products=新的可观察集合();
bc.供应商=新的可观察收集();
使用(var dataDc=new Genesis_datacontext())
{
//dbl_产品可能使用数据读取器,因此使用索引。
//这可能会也可能不会产生错误,这取决于Genesis_DataContext的设计方式。
对于(int i=0;i

我认为,IsBusy是您创建的另一个变量。我不确定它是什么。

请发布错误消息和堆栈跟踪。还请发布示例代码。您的问题的答案是“是”,但我们可以在没有更多信息的情况下提供帮助。这是我使用后台工作获取数据的部分。datacontext是自动生成的linq文件。我从该数据上下文访问数据库数据