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文件。我从该数据上下文访问数据库数据