public partial class Form1 :
{
private static readonly object myLock = new object();
Thread trd;
DataTable dt;
public Form1()
{ InitializeComponent();
dt = new System.Data.DataTable();
DataColumn col = new System.Data.DataColumn();
col.ColumnName = "aa";
dt.Columns.Add(col);
}
private void button1_Click(object sender, EventArgs e)
{
trd = new Thread(delegate()
{
lock (myLock)
{
DataRow drow = dt.NewRow();
drow["aa"] = "55";
dt.Rows.Add(drow);
while (true)
{
//一直循环
}
} });
trd.Start();
}
private void button2_Click(object sender, EventArgs e)
{
DataRow drow = dt.NewRow();
drow["aa"] = "66";
dt.Rows.Add(drow);
}
按钮1 开了死循环线程 锁住了啊
怎么按钮2还可以 往 Datatable里加数据呢?
btn2也加上锁就是了
private void button2_Click(object sender, EventArgs e) { lock(myLock) { DataRow drow = dt.NewRow(); drow["aa"] = "66"; dt.Rows.Add(drow); } }
你锁住了代码1,和个代码2有啥关系呢????
1. 锁的对象是 myLock,又不是 Datatable,当然其它线程能操作 Datatable。
2. Datatable 是实例对象,每次操作都是不同的Datatable 对象,你也锁不定它,操作2中的Datatable和操作1中的 Datatable是不同的对象,不搭嘎。
在java里面,如果锁加了static,那么就是类锁,不会锁实例方法的,你可以参考下
private static readonly object myLock = new object();
改成:
Public static readonly object myLock = new object();