私はマルチスレッドが得意ではありません。しかし、これは私がしなければならないことです。
私はデータグリッドを持っています。データグリッドを最初の 50 行だけで埋めるメソッドが 1 つ必要です。その間、スレッドで次の 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 オブジェクトを 2 つのスレッド化されたメソッドで共有したいと考えています。
しかし、毎回次のエラーが発生します。