我在多线程方面不是那么好。但这是我需要做的。
我有一个数据网格。我想要一种方法来仅用前 50 行填充数据网格。同时,我希望一个线程获取接下来的 20 行并更新数据表,以便在显示 50 行时,将接下来的 20 行附加到数据表对象。通过这种方式,我可以处理大量数据而不会让我的数据表变慢。但是我在多线程中坚持使用资源共享(共享数据表对象)。
有下面的代码
public partial class InsertAndUpdateData : Window
{
DataTable dt = new DataTable();
public object lockOn = new object();
public InsertAndUpdateData()
{
InitializeComponent();
Thread oThread = new Thread(new ParameterizedThreadStart(FillGrid));
oThread.Start(dt);
oThread.Join();
Thread.Sleep(1000);
oThread.Abort();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
string name = txtName.Text;
int salary = Convert.ToInt32(txtSalary.Text);
using (var context = new NewtonEntities())
{
Employee emp = new Employee();
emp.name = name;
emp.salary = salary;
context.AddToEmployees(emp);
context.SaveChanges();
}
FillGridLastRowInserted();
}
public void FillGrid(object dtx)
{
lock (lockOn)
{
dt = (DataTable)dtx;
var db = new NewtonEntities();
var dataTable = (from c in db.Employees
select new
{
c.id,
c.name,
c.salary
}).Take(20);
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("name", typeof(string));
dt.Columns.Add("salary", typeof(int));
foreach (var item in dataTable)
{
DataRow dr = dt.NewRow();
dr["id"] = item.id;
dr["name"] = item.name;
dr["salary"] = item.salary;
dt.Rows.Add(dr);
}
myGrid.ItemsSource = dt.DefaultView;
}
}
public void FillGridLastRowInserted()
{
var db = new NewtonEntities();
var dataTable = (from c in db.Employees
orderby c.id descending
select new
{
c.id,
c.name,
c.salary
}).First();
DataRow dr = dt.NewRow();
dr["id"] = dataTable.id;
dr["name"] = dataTable.name;
dr["salary"] = dataTable.salary;
dt.Rows.Add(dr);
myGrid.ItemsSource = dt.DefaultView;
}
}
我在主类中有一个数据表。我希望 dt 对象由两个线程方法共享。
但是每次我遇到以下错误。